【问题标题】:What to name column in database table that holds versioning number在包含版本号的数据库表中命名列的名称
【发布时间】:2011-01-03 01:36:00
【问题描述】:

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

我这样做是因为当我插入表格时,不必找出下一个版本,然后冒着在我写之前被盗那个号码的风险,我只需插入带有“RecordOrder”的插入" of 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 以确定最近的记录。

【问题讨论】:

  • +1 比我的 DBA 更关心。

标签: database-design data-warehouse columnname


【解决方案1】:

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

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

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

【讨论】:

  • +1 因为这是我通常这样做的方式。但是,如果在此表上的搜索比插入更常见很多,则 rwmnau 的方法可能比在每次搜索时运行 MAX 聚合更有效。既然他标记了数据仓库,那可能是真的。
  • 我无法执行“按 version_id DESC 订购”,因为这仅在我查找单个客户的当前记录时才有效。我经常从该表中提取大量客户,因此如果我增加数字,使用 MAX(version) 的嵌套查询是我唯一的选择——这就是为什么我选择“向后”执行它的原因。不过我觉得这很不友好,因此提出了问题:)
【解决方案2】:

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

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

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

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

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

【讨论】:

    【解决方案3】:

    您为什么不能使用 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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

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

        这样,无论谁在什么时间添加一行,都不会混淆该行的最新版本。

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

        1. 您正在更改一些不需要更改的内容
          • 锁定和阻塞将增加
          • 使用比所需更多的处理能力和内存

        【讨论】:

        • 好主意! +1 您将含义加倍,显示哪条记录是最后一条记录以及编辑发生的时间。
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-12-29
          • 2015-05-24
          • 1970-01-01
          • 1970-01-01
          • 2019-06-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多