我有三张桌子需要像这样连接:
Event(RiskID) -> Risk(RiskID)
Risk(ProjectID) -> Project(ProjectID)
Event(ProjectID) -> Project(ProjectID)使用这些表格:
项目表
+------------+-----------+
| ID | ProjectID |
+------------+-----------+和下面两个表,我试图通过一个外键约束链接
风险
+------------+-----------+------------+
| ID | ProjectID | RiskID |
+------------+-----------+------------+事件(又名风险缓解事件,每个风险多个事件,每个项目多个风险)
+------------+-----------+------------+-------+
| ID | ProjectID | EventID | RiskID|
+------------+-----------+------------+-------+根据我目前对关系数据库(如MySQL )的理解,要创建外键,我应该在链接表中使用一个主键到需要引用值的表,并执行引用完整性。如果所有三个表都有重复的值,即属性集{ProjectID,EventID}是这样的,因为我的所有表都有用于跟踪更改的特定于历史的列信息,那么如何完成此约束?
这种方法让我对在这种情况下如何创建外键产生了一些疑问。如何使用外键内的ID,但仍然使用{ProjectID、EventID} {ProjectID、RiskID} together...etc.
如果我的术语偏离了人们的理解,我可以修改或澄清。希望我的问题(关于外键这个话题)有一个共同的解决方案吗?
发布于 2021-08-24 22:59:10
我会添加几个桥牌,这样每个projet都有许多风险和多极事件。
我不太清楚你为什么有另一个主键,但是好的,每个人都可以做他们喜欢做的事。
每一列都应该只有一列。
项目
Proj_IG(PK) | Project_ID(KEY)event_project
Project_ID(FK) | Envent_ID(FK事件
Evnt_ID | Envent_ID....._如果事件项目和风险是相互喜欢的,您可以用三列来制作一个桥表,一个项目也可以改变事件和风险,但是tas tehy都是相结合的。
risk_project
RIsk_ID Projekt_ID风险
R_ID | Risk_ID项目
Proj_IG(PK) | Project_ID(KEY)event_risk项目
Project_ID(FK) | Envent_ID(FK) | Risk_ID(FK)事件
Evnt_ID | Envent_ID....._风险
R_ID | Risk_ID发布于 2021-08-24 22:17:04
发布于 2021-08-24 22:22:49
Event.ProjectID是冗余的,违反了第三范式。由于给定的风险只引用一个项目,所以如果引用一个项目,但又引用了一个引用不同项目的风险,则可以在事件表中创建异常。事件真正属于哪个项目变得模棱两可。
看起来每个表中都有多余的Id。Project.Id和Project.ProjectId有什么区别?Risk.ProjectId应该参考哪一个?对Project.ProjectId是否有唯一的约束?
通常,如果可能的话,每个表只会生成一个唯一的键,并且它将是主键。
所以你最终会得到这样的东西:
Event(RiskID) -> Risk(RiskID)
Risk(ProjectID) -> Project(ProjectID) 项目
+----------------+
| ProjectID (PK) |
+----------------+风险
+--------------+----------------+
| RiskID (PK) | ProjectID (FK) |
+--------------+----------------+事件
+---------------+-------------+
| EventID (PK) | RiskID (FK) |
+---------------+-------------+https://stackoverflow.com/questions/68914649
复制相似问题