代码之家  ›  专栏  ›  技术社区  ›  Matthew Jones

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

  •  0
  • Matthew Jones  · 技术社区  · 15 年前

    这可能会变得有点复杂。来吧。

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

    一个项目包含许多任务。一个项目也可以有任何数量的修改。

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

    Projects:
    ProjectID
    ProjectName
    
    ProjectRevisions:
    ProjectRevID    
    ProjectID
    ProjectRevName
    
    Tasks:
    TaskID
    ProjectRevID
    TaskName
    HoursToComplete
    

    任务表是从包含任务主列表的另一个表taskDescriptions填充的。

    我的雇主还需要补充报价-这意味着个人可以独立于主报价单引用自己的努力。每次进行ProjectRevision时,必须重做子引号,并且必须保留所有旧的修订和子引号以供将来参考。

    在表模式中,这看起来如何?在我看来,这基本上是一个四级列表:一个项目包含一个修订列表,每个修订列表包含一个子引号列表,每个子引号包含一个任务列表。

    我可能想得太多了,但任何帮助都非常感谢

    4 回复  |  直到 9 年前
        1
  •  2
  •   OMG Ponies    15 年前

    我的雇主还需要补充报价-这意味着个人可以独立于主报价单引用自己的努力。每次进行ProjectRevision时,必须重做子引号,并且必须保留所有旧的修订和子引号以供将来参考。

    在表模式中,这看起来如何?在我看来,这基本上是一个四级列表:一个项目包含一个修订列表,每个修订列表包含一个子引号列表,每个子引号包含一个任务列表。

    假设不存在任何子报价可能与多个用户相关的实例:

    SUBQUOTES 桌子

    • SUBQUOTE_ID PK
    • PROJECT_REV_ID FK
    • USER_ID FK
    • [支持列]

    我看不到对现有数据模型所必需的任何其他更改。

        2
  •  1
  •   Bob    15 年前

    修订的定义是什么?根据情况,我可能会去 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)
    
        3
  •  1
  •   Damir Sudarevic    9 年前

    在这个模型中, Project 表具有代理项 ProjectID 主键(自动递增)和 NaturalKey 这对于一个项目来说必须是独一无二的,并且不能改变(比如“铺平我的车道25764”)。

    发布新修订时,将在 项目 表及 投射物 是递增的,但是 自然密钥 复制完毕。更新版本号并 RevisionStatus 新行中的字段在前一行中设置为“当前”和“过期”。在这一点上,所有的任务都指向旧的修订版,所有的引号都指向那些任务——所以历史记录是被保留的。使用 自然密钥 .

    当任务“结转到”新修订时,它将被复制到具有新主键和指向新修订的外键的新行中。 投射物 . 这样历史也得以保存。

    现在必须为新任务完成所有引号,或者将所有引号复制到具有指向新任务的外键的新行中。 TaskID . 这样,引用历史也会保留下来。

    revision_model_01

        4
  •  0
  •   Patrick Holthuizen    15 年前

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