【问题标题】:I know this is a circular reference but its difficult for me to understand why this is bad我知道这是一个循环引用,但我很难理解为什么这是不好的
【发布时间】:2013-01-29 09:59:50
【问题描述】:

我们有一个项目正在运行,我需要在一个由不同公司创建的新数据库中进行一些 ETL 工作。在浏览开发人员给我的数据库图时,我看到其中 4 个表有一个循环引用:

我无法上传图表,但这里是表格的一般结构:

案例

  • ID (PK) CaseStatusInfo (FK)
  • SignOffPlanning (FK)
  • SignOffReportReview (FK)
  • SignOffQuarterlyReview (FK)

案例状态信息

  • ID (PK)
  • 案例 ID (FK)

退出计划

  • ID (PK)
  • 案例 ID (FK)

SignOffReportReview

  • ID (PK)
  • 案例 ID (FK)

SignOffQuarterlyReview

  • ID (PK)
  • 案例 ID (FK)

如何使用链接到 Case 表的这些 Info 表是通过将主键存储在每个 Info 表中来存储案例的历史状态。这确实合乎逻辑,但我觉得进一步规范化这些表以将历史数据保留在这些规范化表中可能会更好。

我的问题是:使用这种类型的数据库结构而不是进一步规范化表会产生什么问题?

【问题讨论】:

    标签: sql database-design foreign-keys primary-key circular-reference


    【解决方案1】:

    听起来你真的想要这些表的 1-1 关系。我假设每个表都可能有大量其他属性,所以我可以理解为什么你不想将它们组合成一个巨大的 CASE 表。在这种情况下...您可能希望结合 PK/FK 来强制建立 1-1 关系...

    案例

    • ID (PK)
    • CaseStatusInfo (FK)
    • SignOffPlanning (FK)
    • SignOffReportReview (FK)
    • SignOffQuarterlyReview (FK)

    案例状态信息

    • CaseId(PK、FK)

    退出计划

    • CaseId(PK、FK)

    SignOffReportReview

    • CaseId(PK、FK)

    SignOffQuarterlyReview

    • CaseId(PK、FK)

    【讨论】:

    • 嗨菲利克斯。我确实想要 1-1 的关系,但要避免循环引用。正如他们向我解释的那样,这种结构有助于保留历史数据(我觉得这是一种懒惰的方式)。除了我不喜欢这种结构之外,我不确定除了循环引用之外,使用这种设计会有什么问题。
    • 如果您仔细查看我的回答,循环引用不见了?当然,如果案例被删除,CaseStatusInfo、SignOffPlanning、SignOffReportReview 和 SignOffQuartelyReview 就不能存在。但是,您的表中也会出现这种情况(除非 CaseId 在这些表中可以为空)。但是,我假设您也会保留“历史数据”的案例数据......
    • 我应该指出,当您插入其中一个表时 CaseId = Case.Id 的关联案例记录。
    猜你喜欢
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多