4

我试图弄清楚在我的数据库表中调用该列的内容,该列将 INT 保存到特定的“记录版本”。我目前正在使用“ RecordOrder ”,但我不喜欢这样,因为人们认为higher=newer,但我使用它的方式,lower=newer(“1”是当前记录,“2”是第二个最新的,“3”更老,依此类推)。我考虑过“ RecordVersion ”,但恐怕会有同样的问题。还有其他建议吗?“记录时代”?

我这样做是因为当我插入表格时,不必找出下一个版本,然后冒着在我写之前从我身上偷走该号码的风险,我只需插入带有“RecordOrder”为0的插入. 表 AFTER INSERT 上有一个触发器,它将该键的所有“RecordOrder”数字加 1,所以我刚刚插入的记录变为“1”,所有其他记录都加 1。这样,你可以得到一个人的当前记录通过选择 RecordOrder=1,而不是获取 MAX(RecordOrder) 然后选择它。

PS -我也愿意批评为什么这是一个糟糕的主意,我应该增加这个索引。这似乎使查找更容易,但如果这是一个坏主意,请赐教!

有关数据的一些详细信息,例如:

我有以下数据库表:

CREATE TABLE AmountDue (
    CustomerNumber INT,
    AmountDue      DECIMAL(14,2),
    RecordOrder    SMALLINT,
    RecordCreated  DATETIME
)

我的数据子集如下所示:

CustomerNumber    Amountdue      RecordOrder                 RecordCreated
           100            0                1       2009-12-19 05:10:10.123
           100        10.05                2       2009-12-15 06:12:10.123
           100       100.00                3       2009-12-14 14:19:10.123
           101         5.00                1       2009-11-14 05:16:10.123

在此示例中,客户 100 有三行 - 他们欠 100 美元,然后是 10.05 美元,现在他们什么都不欠。让我知道是否需要进一步澄清。

更新:

“RecordOrder”和“RecordCreated”列对用户不可用 - 它们仅供内部使用,并帮助确定哪个是当前客户记录。此外,我可以使用它返回一个适当排序的客户历史记录,尽管我可以很容易地使用日期来完成。我想,我可以只用 RecordCreated 日期完成与递增“记录版本”相同的事情,但这消除了知道 RecordOrder=1 是当前记录的便利,我又回到做一个子查询DateTime 上的 MAX 或 MIN 以确定最近的记录。

4

6 回答 6

4

我认为“当前版本 = 1”是个坏主意,因为当您添加新的当前记录时,您必须更新所有以前的版本。任何其他引用旧版本号的表或应用程序现在都是错误的。我必须编写一个与大型机程序交互的服务,就像这样,这是一个巨大的头痛,浪费了数十个开发人员的时间。

我通常使用一个version_id字段进行版本控制,每次都会增加。然后当我想找到最新的记录时,我order by version_id desc在查询中只选择第一行。

编辑:我没有看到 iandisme 刚刚指出的数据仓库标签。如果选择所有版本不起作用,我见过一些系统保留一个单独的表,该表只存储另一个表中每条记录的最新版本。因此,当向Record表中添加新版本时,相应的RecordVersion记录会更新以存储该新版本。对于我从事的工作来说,这一直是矫枉过正,但我​​不会在整个数据仓库上工作,所以我不知道这会是更好还是更糟。

于 2010-01-08T19:51:56.383 回答
2

我认为您应该使用具有当前时间默认值的 TimeStamp 字段,而不是使用整数来说明哪一行是最新的版本。

这样,无论谁在什么时间添加行,都不会对最新版本的行产生歧义。

我认为将所有相关行重新编号为 id+1 并不是一个好主意,原因有很多:

  1. 你正在改变一些不需要改变的东西
    • 锁定和阻塞将增加
    • 使用比所需更多的处理能力和内存
于 2010-01-08T20:05:17.653 回答
1

为什么您不能使用 RecordCreated 日期来完成基本相同的事情?

做类似的事情:

select top 1 columna, columnb, etc. from table order by RecordCreated desc

会给你最新的记录,你不必担心记录修改。

记录重新编号方法可能会导致各种问题(索引争用、锁升级等)。

锁升级: http: //msdn.microsoft.com/en-us/library/aa213033 (SQL.80).aspx

索引争用:http: //blogs.digineer.com/blogs/jasons/archive/2009/02/25/monitoring-index-contention-with-dmfs.aspx

正如其他人在数据仓库方面提到的那样,您始终可以在数据集顶部放置视图或快照或类似的东西,以便以您想要的格式(仅最新记录等)为您提供数据。显然,我不熟悉您的哪些限制或要求足以知道视图/快照/等。在你的情况下是有意义的。

于 2010-01-08T19:52:24.217 回答
1

我喜欢 Raj More 使用时间戳的想法。但我意识到任何搜索最新记录的查询都会很困难,并且会导致繁重的处理。
所以我建议这个想法:对记录顺序使用时间戳(无论如何它都在那里),但保留一个字节字段以轻松识别最新记录。
在这种情况下,当前记录的最新记录值 = 1,而其他记录 = NULL。这样你也许可以创建一个忽略空值的索引?
这将大大简化您的所有查询。

于 2010-01-08T20:31:16.353 回答
0

你所说的是一个时代而不是一个版本,所以你可以称之为 RecordAge。但是我会完全摆脱它,因为您似乎想要做的就是获得特定客户的最新订单。

这可以通过使用客户编号和日期/时间字段来实现。如果您将这两者结合为唯一约束,并将重试逻辑放在您的客户端代码中,以便在极少数情况下获得竞争条件,那么您应该没有问题。

在插入一条记录时触发触发器以修改大量记录的想法是一个坏主意,因为随着记录的添加,它变得越来越昂贵。

非常严格地看待任何引入任意列(如版本号)的设计。它实际上是一个派生属性(取决于其他属性,在这种情况下是客户编号和日期),虽然出于性能原因这样做是可以的,但只有在您了解后果的情况下才应该这样做以缓解特定问题。

我看不到在日期上使用小整数来抵消自己的触发器成本的性能改进,但与所有数据库决策一样,衡量,不要猜测

于 2010-01-08T19:51:57.307 回答
0

好的,我看到的问题是您将浪费大量的数据库处理时间重新编号。另外,我不知道您是否将 recordOrder 暴露给用户,但如果您是,他们将希望能够使用该数字询问有关它的问题,并且不断更改它会令人困惑和烦人。当然,您已经指出的问题是订单不是未来开发人员可能期望的。

为什么不只使用身份字段,然后编号将是自动的(那么在插入之前窃取号码将永远不会成为问题)。只要您可以按 id desc 和客户编号订购以查看一个人的所有记录,是否为每个客户重复编号真的很重要吗?或者您可以使用记录日期字段来订购记录。

于 2010-01-08T19:54:28.020 回答