代码之家  ›  专栏  ›  技术社区  ›  SqlRyan

保存版本号的数据库表中要命名的列

  •  4
  • SqlRyan  · 技术社区  · 15 年前

    我正试图找出如何调用数据库表中的列,该列将int保存到特定的“记录版本”。我正在使用“ 记录顺序 但是我不喜欢这样,因为人们认为高=新,但是我使用它的方式,低=新(其中“1”是当前的记录,“2”是第二个最新的记录,“3”还是老的记录,等等)。我已经考虑过了” 记录版本 “,但恐怕也会有同样的问题。还有什么建议吗?” 记录 “?

    我这样做是因为当我插入到表中时,不必知道下一个版本是什么,而是冒着在我写之前从我这里窃取号码的风险,我只需插入“recordorder”为0的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”列对用户不可用-它们只供内部使用,并帮助确定哪些是当前客户记录。此外,我还可以使用它返回一个适当订购的客户历史记录,尽管我也可以很容易地在日期中这样做。我想,我可以用记录创建日期来完成与递增“记录版本”相同的事情,但是这样就省去了知道recordorder=1是当前记录的便利性,我又回到用日期时间上的max或min进行子查询,以确定最新的记录。

    6 回复  |  直到 6 年前
        1
  •  4
  •   Kaleb Brasee    15 年前

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

    我通常使用 version_id 字段,每次都递增。当我想找到最新的唱片时,我 order by version_id desc 在查询中,只选择第一行。

    编辑: 我没有看到IAndisme刚刚指出的数据仓库标签。如果选择所有的版本都不起作用,我看到一些系统会保留一个单独的表,只在另一个表中存储每个记录的最新版本。所以当一个新版本被添加到 Record 表,适当的 RecordVersion 记录将被更新以存储新版本。对于我所做的工作来说,这一直都是多余的,但我不在整个数据仓库中工作,所以我不知道这会是好是坏。

        2
  •  2
  •   Raj More    15 年前

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

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

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

    1. 你在改变一些不需要改变的东西
      • 锁定和阻塞将增加
      • 使用比需要更多的处理能力和内存
        3
  •  1
  •   Brian Hasden    15 年前

    您为什么不能使用记录创建日期来完成本质上相同的事情呢?

    做一些类似的事情:

    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
  •  1
  •   iDevlop    6 年前

    我喜欢Raj More使用时间戳的想法。 但我认识到,任何搜索最新记录的查询都将很困难,并将导致大量处理。
    所以我建议这样的想法:用时间戳(不管怎样它在那里)来记录订单, 但保留一个字节字段,以便轻松识别最新记录。
    在这种情况下,当前记录的LatestRecord值为1,而其他值为空。这样您就可以创建忽略空值的索引了吗?
    这将大大简化您的所有查询。

        5
  •  0
  •   HLGEM    15 年前

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

    为什么不直接使用一个标识字段,然后编号将是自动的(那么在插入之前窃取一个数字将是一个问题)。如果对每个客户重复编号是否真的很重要,只要您可以按ID DESC和客户编号订购,以查看一个人的所有记录?或者您可以使用记录日期字段来订购记录。

        6
  •  0
  •   paxdiablo    15 年前

    你所说的是一个时代而不是一个版本,所以你可以称之为记录。但我会把它全部处理掉,因为你似乎只想为一个特定的客户获得最近的订单。

    这可以通过使用客户编号和日期/时间字段来实现。如果将这两个约束组合为唯一约束,并在客户端代码中 稀有的 如果你有比赛条件,你应该没有问题。

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

    仔细研究任何引入任意列(如版本号)的设计。它实际上是一个派生属性(取决于其他属性,在本例中是客户编号和日期),尽管出于性能原因可以这样做,但应该只在理解结果的情况下减轻特定的问题。

    我看不到使用一个小整数来抵消触发器本身的成本所带来的性能改进,但是,和所有数据库决策一样, 测量,不要猜测 .