这可能会有点复杂。到此为止。
假设我们有这样的亲子关系:
项目包含许多任务。项目也可以有任意数量的修订。
这些表的数据库模式如下所示:
Projects:
ProjectID
ProjectName
ProjectRevisions:
ProjectRevID
ProjectID
ProjectRevName
Tasks:
TaskID
ProjectRevID
TaskName
HoursToComplete
任务表从另一个表TaskDescriptions填充,其中包含任务的主列表。
我的雇主也想要子报价 - 这意味着个人可以引用他自己的努力与主报价分开。每次进行ProjectRevision时,必须重做子引号,并且必须保留所有旧的Revisions和SubQuotes以供将来参考。
这会如何在表架构中显示?在我看来,这基本上是一个四级列表:一个项目包含一个修订列表,每个包含一个SubQuotes列表,每个子列表包含一个任务列表。
我可能会过度思考这一点,但非常感谢任何帮助
答案 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
的外键。这样也可以保留报价历史。
答案 3 :(得分:0)
或者任务可能有零个或一个子引用。很大程度上取决于你的背景。