数据库重新设计以存储具有不同用途的相同项目

时间:2013-02-14 13:17:06

标签: database-design

我有下表:

Product (Id, CategoryId, Description, Value)

有一天,所有旧产品不再销售,新产品到货。 但是,我想保留旧的购买历史。 我想过添加一个可以用来区分old和new的字段并制作这个表:

Product (Id, CategoryId, Description, Value, Available)

OR

使用新表:

ProductVersionTwo (Id, CategoryId, Description, Value)

同样的策略将适用于表ProductCategory以及可能正在使用Product的任何其他表。

我不知道这种变化会发生多少次,但肯定会非常罕见。

您会推荐什么解决方案?

2 个答案:

答案 0 :(得分:1)

我会采用第一种方法稍作改动。由于您不知道以后是否需要此信息,我会将available列替换为时间戳列validFromvalidTovalidTo如果是现在可用的产品,则为NULL。为了不让用户感到困惑,我创建了一个视图SELECT * /*except maybe validFrom and validTo*/ FROM Product WHERE validTo IS NULL;

使用你的第二种方法你没有任何优势,除非你没有适当地索引第一种方法并且确实有非常多的产品可能会有更好的表现。相反,您只需使用UNION进行丑陋的查询,并在运行时创建额外的列以区分产品版本。另外,您必须存储有关不同版本表的信息。一年之后,你会想知道第2版的特别之处.3?

第二种方法的另一个问题可能是在您使用自动增量列时加入其他表。您必须从先前版本表中的max(自动增量)开始,以便在使用旧产品进行分析时不要混淆等等。我认为不好的主意。

答案 1 :(得分:0)

如果我是你,我会选择第一个选项。这样做更容易,将来再次发生这种变化时,您只需将旧产品标记为“不可用”。