【发布时间】:2021-10-25 02:31:58
【问题描述】:
我有三个表需要像这样链接:
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} 一起使用...等等...
如果我的术语与所理解的有偏差,我可以修改或澄清。希望我的问题(关于外键的这个话题)有一个共同的解决方案?
【问题讨论】:
-
为什么表 risk 有 ID 和 RiskId ?
-
通常只有一个id所以id =event_id。如果一个项目可能有很多风险,那么您需要一个桥接表
-
@Raphael, Id 是该表的唯一键,因为我在附加列中非破坏性地添加具有所采取操作(创建、更新、删除)的记录,以记录历史上下文和特定用户执行的操作
-
@nbk,我删除了我的桥接实体评论,但我对这种方法有一个想法
-
声明一个 FK 告诉 DBMS 某处的子行值在其他地方显示为 UNIQUE。如果不是这样,您为什么要声明 FK? (修辞。)你没有解释你想要什么或为什么或如何被卡住。您的“理解”和目标/问题没有被清楚地描述并且似乎被误解了。遵循已发布的信息建模和数据库设计参考/教科书,并提出 1 个经过研究的特定非重复问题,以了解您是如何第一次陷入困境/不确定的。
标签: database-design entity-relationship database-normalization