数据库设计 - 四级亲子关系

时间:2009-11-11 20:47:53

标签: database-design

这可能会有点复杂。到此为止。

假设我们有这样的亲子关系:

项目包含许多任务。项目也可以有任意数量的修订。

这些表的数据库模式如下所示:

Projects:
ProjectID
ProjectName

ProjectRevisions:
ProjectRevID    
ProjectID
ProjectRevName

Tasks:
TaskID
ProjectRevID
TaskName
HoursToComplete

任务表从另一个表TaskDescriptions填充,其中包含任务的主列表。

我的雇主也想要子报价 - 这意味着个人可以引用他自己的努力与主报价分开。每次进行ProjectRevision时,必须重做子引号,并且必须保留所有旧的Revisions和SubQuotes以供将来参考。

这会如何在表架构中显示?在我看来,这基本上是一个四级列表:一个项目包含一个修订列表,每个包含一个SubQuotes列表,每个子列表包含一个任务列表。

我可能会过度思考这一点,但非常感谢任何帮助

4 个答案:

答案 0 :(得分:2)

  

我的雇主也想要子报价 - 这意味着个人可以引用他自己的努力与主报价分开。每次进行ProjectRevision时,必须重做子引号,并且必须保留所有旧的Revisions和SubQuotes以供将来参考。

     

这会如何在表架构中显示?在我看来,这基本上是一个四级列表:一个项目包含一个修订列表,每个包含一个SubQuotes列表,每个子列表包含一个任务列表。

假设不存在子引用可能与多个用户相关的任何情况:

SUBQUOTES

  • SUBQUOTE_ID,pk
  • PROJECT_REV_ID,fk
  • USER_ID,fk
  • [支持栏目]

我没有看到现有数据模型需要进行任何其他更改。

答案 1 :(得分:1)

修订的定义是什么?根据我的意愿,我可能会选择temporal design。因此,项目表将存储修订,而不是具有多个修订的项目。您可以通过添加列来跟踪上一个主键,修订开始日期和修订结束日期来完成此操作。进行修订时,旧的Id将从新记录链接回来。新记录将具有现在的开始时间和空的结束日期。旧记录将有一个空的结束日期,但这也需要更新到现在。旧记录仍将指向所有旧的子报价。

Project
-----------------
Id
RevisisedFromId
RevisionStartDate
RevisionEndDate
RevisionNumber (optional, this can be calculated)


SubQuote
-----------------   
Id
ProjectId (when a new revision is made, this will still point to the old revision)

答案 2 :(得分:1)

在此模型中,Project表具有代理ProjectID主键(自动增量)和NaturalKey,它必须是项目唯一且无法更改(如“铺设我的车道25764”)。

发布新版本时,会在Project表中插入一个新行,ProjectID会递增,但会复制NaturalKey。版本号已更新,新行中的RevisionStatus字段设置为“当前”,并在上一行中设置为“已过期”。此时,所有任务都指向旧版本,所有引用都指向这些任务 - 因此保留了历史记录。使用NaturalKey可以轻松跟踪修订(收集所有ProjectID)。

当任务被“转移”到新版本时,它将被复制到一个新行,其中包含一个新的主键,外键指向新的ProjectID。这样也可以保留历史。

现在必须为新任务执行所有引号,或将所有引号复制到新行,并使用指向新TaskID的外键。这样也可以保留报价历史。

revision_model_01

答案 3 :(得分:0)

或者任务可能有零个或一个子引用。很大程度上取决于你的背景。