数据库表中包含版本号的名称列什么

时间:2010-01-08 19:44:25

标签: database-design data-warehouse columnname

我正在试图找出在我的数据库表中调用该列的内容,该列包含特定“记录版本”的INT。我目前正在使用“ RecordOrder ”,但我不喜欢这样,因为人们认为更高=更新,但我使用它的方式,更低=更新(“1”是目前的记录,“2”是第二最新的,“3”仍旧,等等)。我考虑过“ RecordVersion ”,但我担心这会有同样的问题。还有其他建议吗? “的 RecordAge

我这样做是因为当我插入表格时,而不是必须找出下一个版本,然后冒着在我写之前从我这个号码被盗的风险,我只是插入带有“RecordOrder”的插入在表格上有一个触发器,它将该键的所有“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确定最近的记录。

6 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:2)

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

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

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

  1. 你正在改变一些无需改变的东西
    • 锁定和阻止会增加
    • 使用比所需更多的处理能力和内存

答案 2 :(得分: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 / etc.在你的情况下有意义。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

这可以通过使用客户编号和日期/时间字段来实现。如果你将这两者的组合作为一个独特的约束,并在你的客户代码中将重试逻辑放在罕见的机会上,你就会遇到竞争条件,你应该没有问题。

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

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

我无法看到在日期上使用小整数作为自己抵消触发器成本的性能改进,但是,与所有数据库决策一样,测量,不要猜测。 / p>

答案 5 :(得分:0)

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

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