Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 我知道这是一个循环引用,但我很难理解为什么这是不好的_Sql_Database Design_Foreign Keys_Primary Key_Circular Reference - Fatal编程技术网

Sql 我知道这是一个循环引用,但我很难理解为什么这是不好的

Sql 我知道这是一个循环引用,但我很难理解为什么这是不好的,sql,database-design,foreign-keys,primary-key,circular-reference,Sql,Database Design,Foreign Keys,Primary Key,Circular Reference,我们有一个正在运行的项目,我需要对另一家公司创建的新数据库进行一些ETL工作。在浏览开发人员提供给我的数据库图时,我看到其中4个表上有一个循环引用: 我无法上传图表,但以下是表的一般结构: 案例 ID(主键)案例状态信息(FK) 签核计划(FK) 签署报告审查(FK) 签字人季度回顾(FK) 案例状态信息 ID(主键) 案件编号(FK) 签核计划 ID(主键) 案件编号(FK) 签署报告回顾 ID(主键) 案件编号(FK) 签名者:四分之一评论 ID(主键) 案件编号(FK)

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

我无法上传图表,但以下是表的一般结构:

案例

  • ID(主键)案例状态信息(FK)
  • 签核计划(FK)
  • 签署报告审查(FK)
  • 签字人季度回顾(FK)
案例状态信息

  • ID(主键)
  • 案件编号(FK)
签核计划

  • ID(主键)
  • 案件编号(FK)
签署报告回顾

  • ID(主键)
  • 案件编号(FK)
签名者:四分之一评论

  • ID(主键)
  • 案件编号(FK)
这些链接到案例表的信息表的使用方式是,它将通过在每个信息表中存储主键来存储案例的历史状态。这确实是合乎逻辑的,但我觉得最好进一步规范化这些表,以便将历史数据保留在这些规范化的表中


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

听起来您真的希望与这些表建立1-1关系。我假设每个表可能都有大量的其他属性,这样我就可以理解为什么不想将它们组合成一个巨大的CASE表。那样的话。。。您可能希望合并PK/FK以强制建立1-1关系

案例

  • ID(主键)
  • 案例状态信息(FK)
  • 签核计划(FK)
  • 签署报告审查(FK)
  • 签字人季度回顾(FK)
案例状态信息

  • 案例ID(PK,FK)
签核计划

  • 案例ID(PK,FK)
签署报告回顾

  • 案例ID(PK,FK)
签名者:四分之一评论

  • 案例ID(PK,FK)

你好,菲利克斯。我确实想要一对一的关系,但避免循环引用。正如他们向我解释的那样,这种结构有助于保存历史数据(我觉得这是一种懒惰的方式)。除了我不喜欢这种结构之外,我不确定使用这种设计会有什么问题,除了圆形参考的问题。如果你仔细看我的答案,圆形参考消失了?当然,如果删除案例,则案例状态信息、SignOffPlanning、SignOffReportReview和SignOffQuarteryReview将不存在。但是,在您的表中也是如此(除非这些表中的CaseId可以为空)。但是,我假设您也会保留“历史数据”的案例数据……我应该指出,当您插入其中一个表时,关联案例记录的CaseId=case.Id。