【问题标题】:Storing Revisions of Relational Objects in an Efficient Way以有效的方式存储关系对象的修订
【发布时间】:2010-07-02 22:28:14
【问题描述】:

我不确定以前是否已经回答过此类问题。在我的数据库中,我有一个产品表和规格表。每个产品可以有多种规格。在这里,我需要将每个产品的修订版本存储在数据库中,以便以后查询它们以用于历史记录。

因此,每次用户对这些关系进行更改时,我都需要一种有效的方法来存储产品与规范的关系。数据量也可能变得非常大。例如,假设数据库中有 100000 个产品:每个产品可以有 30 个规格,并且每个产品至少有 20 个修订版。因此,通过将所有数据存储在一个表中,数据量会变得非常高。

有什么建议吗?

【问题讨论】:

  • 您的用户需要多久查询一次给定产品的历史实例?如果更改是针对产品(而不是其规格),您需要存储 everthing 的修订版还是仅存储已更改的记录?
  • 实际上,由于用户几乎可以编辑他喜欢的任何内容以更改产品数据,我认为我必须保留产品详细信息以及与规格关系的数据。

标签: sql mysql database database-design


【解决方案1】:

如果这纯粹是为了“存档”目的,那么单独的修订表可能会更好。

但是,如果您需要将以前的修订版与当前修订版同等对待(例如,如果您希望让用户能够将产品恢复到以前的修订版),那么最好保留一个产品表,而不是而不是在表之间复制数据。如果您担心性能,这就是索引的用途。

您可以为产品表创建复合主键,例如PRIMARY KEY (product_id, revision)。也许通过为特定的product_id 选择具有最高revision 的行来查找当前版本的存储过程会很有用。

【讨论】:

    【解决方案2】:

    我会建议有一个表,具有 HistoryDate 列的当前表的精确副本,并将修订存储在此表中。您可以对所有 3 个相关表格执行此操作。

    通过将修订版与主表分开,您在查询主表时不会受到任何性能损失。

    您还可以查看保存记录以指示更改数据的用户。

    【讨论】:

      猜你喜欢
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-31
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      相关资源
      最近更新 更多