具有修订号的项目的表设计

时间:2013-10-15 21:23:15

标签: sql database-design

我有两张表:CHECKLIST_INSTANCECHECKLIST_CLASS

CHECKLIST_INSTANCE中,我将外键存储到CHECKLIST_CLASS_ID,以便我知道该实例正在使用哪个核对表。

CHECKLIST_CLASS
   CHECKLIST_CLASS_ID
   REVISION
   NAME

CHECKLIST_CLASS中的示例数据可能是:

  1, A, ABC Checklist
  2, A, XYZ Checklist
  3, A, QWE Checklist
  4, B, ABC Checklist

现在的问题是修改。当我们修改清单时,我目前的策略是给它一个新的代理主键并更改Rev(如清单ABC Checklist

我觉得通过这种策略,我失去了CHECKLIST_CLASS_ID 1和4相关的关联。

如果我要更改设计,以便我使用组合PK CHECKLIST_CLASS

  1, A, ABC Checklist
  2, A, XYZ Checklist
  3, A, QWE Checklist
  1, B, ABC Checklist

然后我必须更改我的CHECKLIST_INSTANCE表以包含CHECKLIST_CLASS_REV作为外键,然后我的所有查询都需要修改。

另一个选择是向CHECKLIST_CLASS添加一列。分别是PREVIOUS_REV_ID或NEXT_REV_ID

  using a PREVIOUS_REV_ID field
  1, A, ABC Checklist, null
  2, A, XYZ Checklist, null
  3, A, QWE Checklist, null
  4, B, ABC Checklist, 1

  using a NEXT_REV_ID field
  1, A, ABC Checklist, 4
  2, A, XYZ Checklist, null
  3, A, QWE Checklist, null
  4, B, ABC Checklist, null

使用最后两个中的任何一个,我不必更改CHECKLIST_INSTANCE表或查询。有关最佳设计的想法吗?或者我应该调查一种不同的方法吗?

== 编辑 为了清楚起见,我不是在为CHECKLIST_CLASS表上的编辑寻找审计跟踪。

2 个答案:

答案 0 :(得分:2)

这里的问题是,通过将修订添加到核对表,您不再拥有每个核对表一行的表。由于清单是一个独特的实体,因此您应该确保拥有这样的表格。

我建议修改移到另一个表,所以你现在有三个表 - checklist_class,checklist_class_revisions和checklist_instance引用checklist_class。 checklist_class仍然可以包含最新的清单修订版,使清单修订表成为历史记录。

或者,如果需要将实例链接到修订版,则清单修订表可以是清单实例的父级,从而提供三个表层次结构。

答案 1 :(得分:1)

(回复我对@ David回答我的评论的回复。)

Theres'很多“它取决于”这里。一个改写的模型是:[Checlikst]有许多[Revisions],[Revision]有很多[Instances]。这是三个与外键相关的表格。问题是,这是否恰当地代表了您试图实施的业务模式?拥有三个独立的实体是否有意义?对此的答案(最后部分)将基于它们的使用方式。拥有独立于修订的[清单]实体以及仅与清单修订相关的[实例]实体是否有价值和好处?或者[清单/修订]是否足够独立,您真的不需要父/子关系?从表面上看,这是非规范化数据,但是如果没有真正的理由将它们标准化 - 如果它们不是单独的实体 - 那么就不要给自己不必要的额外工作。 (我,我会完全正常化,但我不知道你情况的全部细节。)

困难的部分是“水晶球”的工作:你必须根据可能尚未知晓的因素做出决定(即你需要在一周,一个月,一年内做些什么?)熟悉项目的目标和宗旨,您将做出更好的决策。我的建议:花时间,仔细考虑,并尽量避免明天你可能会后悔的决定。 (你将有足够的时间为你所做的明智的错误决定感到后悔,但你做出这些决定的借口会更好。)