2010-01-08 74 views
3

我想弄清楚什么要调用我的数据库表中保存INT到特定“记录版本”的列。我目前使用“RecordOrder”,但我不喜欢那样,因为人们认为更高=更新,但是我使用它的方式,更低=更新(以“1”为当前记录,“2 “成为第二最新的”,“3”更老,等等)。我认为“RecordVersion”,但我恐怕会有同样的问题。还有其他建议吗? “RecordAge”?什么名称列在数据库表中保存版本号

我这样做是因为当我插入到表中时,而不必知道下一个版本是什么,然后运行在编写之前从我那里窃取的编号的风险,我只是插入带有“ 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美元,现在他们什么也没欠。让我知道是否需要再澄清一点。

UPDATE:

的“RecordOrder”和“RecordCreated”列不提供给用户 - 他们只是有供内部使用,并帮助找出哪些是当前的客户记录。此外,我可以用它来返回适当的客户历史记录,尽管我可以轻松地在日期上做到这一点。我可以完成同样的事情,只是使用RecordCreated日期递增的“Record Version”(记录版本),但是这消除了了解RecordOrder = 1是否为当前记录的便利性,然后我回到了执行子查询MAX或MIN在DateTime上确定最近的记录。

+1

+1关心比我的DBA更多。 – iandisme 2010-01-08 19:59:01

回答

3

我认为“当前版本= 1”是一个坏主意,因为当你添加一个新的当前记录时,你将不得不更新所有以前的版本。而任何引用旧版本号的表或应用程序现在都会出错。我必须编写一个与大型机程序接口的服务,这是一个非常头疼的事情,浪费了几十个开发人员的时间。

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

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

+0

+1因为我通常这样做。尽管如此,如果这张表的搜索比insert更普遍,rwmnau的方法可能比在每个搜索上运行MAX汇总更高效一些。由于他标记了数据仓库,这可能是真的。 – iandisme 2010-01-08 19:58:18

+0

我无法做一个“order by version_id DESC”,因为只有当我查找单个客户的当前记录时才有效。我经常从这个表中抽出大量客户,所以如果我增加数字,那么使用MAX(版本)的嵌套查询是我唯一的选择 - 这就是为什么我选择“向后”这样说。我有一种感觉,这是不友善的,因此,问题:) – SqlRyan 2010-01-08 20:15:46

0

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

这可以通过使用客户号码和日期/时间字段来实现。如果你将这两个组合作为一个唯一的约束条件,并在你的客户代码中加上重试逻辑,那么你很可能会遇到竞争条件,所以你应该没有问题。

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

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

我无法看到使用日期中的小整数作为抵消触发器成本的性能改进,但与所有数据库决策一样,度量,请勿猜测

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

正如其他人在关于数据仓库所提到的,你总是可以把一个视图或快照或数据集的顶部类似的东西给你以您想要的格式输出数据(仅限最新的记录等)。显然我不太了解你的约束或要求,足以知道view/snapshot /等。在你的情况下有意义。

0

好吧,我看到这个问题是,你会浪费很多数据库处理时间重新编号。另外,我不知道你是否将recordOrder公开给用户,但是如果你是他们,他们会希望能够使用该号码询问关于它的问题,并且不断变化将会令人困惑和恼人。当然,你已经指出的问题在哪里,订单不是未来开发商可能期望的。

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

2

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

这样,无论谁在什么时候添加一行,关于该行的最新版本都不会有歧义。

我想重新编号所有相关行ID + 1是不是有多个原因是一个好主意:

  1. 你正在改变的东西,就没有必要改变
    • 锁定和阻塞会增加
    • 使用比需要更大的处理能力和存储器
+0

好主意! +1 您将意义加倍,显示哪个记录是最后一个记录,以及编辑发生的时间。 – 2010-01-08 20:21:44

0

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

相关问题