数据库 Table 三个相关表的设计重组
Database Table Design Restructuring for three related tables
我有三个 table 需要像这样 linked:
Event(RiskID) -> Risk(RiskID)
Risk(ProjectID) -> Project(ProjectID)
Event(ProjectID) -> Project(ProjectID)
使用这些 table:
项目Table
+------------+-----------+
| ID | ProjectID |
+------------+-----------+
我试图通过外键约束 link 的底部两个 table
风险
+------------+-----------+------------+
| ID | ProjectID | RiskID |
+------------+-----------+------------+
事件(又名,风险缓解事件,每个风险有很多事件,每个项目有很多风险)
+------------+-----------+------------+-------+
| ID | ProjectID | EventID | RiskID|
+------------+-----------+------------+-------+
根据我目前对 MySQL 等关系数据库的理解,要创建外键,我应该在 linked table 到 [=36= 中使用一个主键] 需要引用值,并强制执行引用完整性。如果所有三个 table 都具有重复值,即对于属性集 {ProjectID,EventID},我该如何实现此约束,因为我的所有 table 都有一个特定于历史的列信息来跟踪变化?
这种方法让我对在这种情况下如何在必要时创建外键产生了一些疑问。我如何在我的外键中使用 ID 但仍然一起使用 {ProjectID, EventID} {ProjectID, RiskID}...等...
如果我的术语与理解的有所不同,我可以修改或澄清。希望我的问题(关于外键这个话题)有一个共同的解决方案?
外键不需要指向主键
如果您真的想为非主键创建外键,它必须是一个对其具有唯一约束的列。
这个线程更明确一些
Foreign Key to non-primary key
Event.ProjectID
是多余的并且违反了第三范式。由于给定的风险仅引用一个项目,因此如果您引用一个项目但又引用另一个项目的风险,则可以在事件 table 中创建异常。事件真正属于哪个项目变得模棱两可。
看起来你在每个 table 中都有一个多余的 Id。 Project.Id 和 Project.ProjectId 有什么区别? Risk.ProjectId 应该参考哪一个? Project.ProjectId 是否有唯一约束?
通常情况下,如果可能,您会为每个 table 创建一个唯一键,并且它将作为主键。
所以你最终会得到这样的东西:
Event(RiskID) -> Risk(RiskID)
Risk(ProjectID) -> Project(ProjectID)
项目
+----------------+
| ProjectID (PK) |
+----------------+
风险
+--------------+----------------+
| RiskID (PK) | ProjectID (FK) |
+--------------+----------------+
事件
+---------------+-------------+
| EventID (PK) | RiskID (FK) |
+---------------+-------------+
我会添加几个桥梁 tables 以便每个项目 kann 都有很多风险和多极事件
我不太清楚为什么你有另一个主唯一键,但好吧 evrybiody 可以做他们喜欢的事
每一列应该只有一个
项目
Proj_IG(PK) | Project_ID(KEY)
event_project
Project_ID(FK) | Envent_ID(FK
事件
Evnt_ID | Envent_ID....._
如果事件项目和风险是相互的,你可以用三个柱子做一个桥table,所以一个项目也可以有多个事件和风险,但它们都连接在桥上table yan 表示
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
我有三个 table 需要像这样 linked:
Event(RiskID) -> Risk(RiskID)
Risk(ProjectID) -> Project(ProjectID)
Event(ProjectID) -> Project(ProjectID)
使用这些 table:
项目Table
+------------+-----------+
| ID | ProjectID |
+------------+-----------+
我试图通过外键约束 link 的底部两个 table
风险
+------------+-----------+------------+
| ID | ProjectID | RiskID |
+------------+-----------+------------+
事件(又名,风险缓解事件,每个风险有很多事件,每个项目有很多风险)
+------------+-----------+------------+-------+
| ID | ProjectID | EventID | RiskID|
+------------+-----------+------------+-------+
根据我目前对 MySQL 等关系数据库的理解,要创建外键,我应该在 linked table 到 [=36= 中使用一个主键] 需要引用值,并强制执行引用完整性。如果所有三个 table 都具有重复值,即对于属性集 {ProjectID,EventID},我该如何实现此约束,因为我的所有 table 都有一个特定于历史的列信息来跟踪变化?
这种方法让我对在这种情况下如何在必要时创建外键产生了一些疑问。我如何在我的外键中使用 ID 但仍然一起使用 {ProjectID, EventID} {ProjectID, RiskID}...等...
如果我的术语与理解的有所不同,我可以修改或澄清。希望我的问题(关于外键这个话题)有一个共同的解决方案?
外键不需要指向主键
如果您真的想为非主键创建外键,它必须是一个对其具有唯一约束的列。
这个线程更明确一些 Foreign Key to non-primary key
Event.ProjectID
是多余的并且违反了第三范式。由于给定的风险仅引用一个项目,因此如果您引用一个项目但又引用另一个项目的风险,则可以在事件 table 中创建异常。事件真正属于哪个项目变得模棱两可。
看起来你在每个 table 中都有一个多余的 Id。 Project.Id 和 Project.ProjectId 有什么区别? Risk.ProjectId 应该参考哪一个? Project.ProjectId 是否有唯一约束?
通常情况下,如果可能,您会为每个 table 创建一个唯一键,并且它将作为主键。
所以你最终会得到这样的东西:
Event(RiskID) -> Risk(RiskID)
Risk(ProjectID) -> Project(ProjectID)
项目
+----------------+
| ProjectID (PK) |
+----------------+
风险
+--------------+----------------+
| RiskID (PK) | ProjectID (FK) |
+--------------+----------------+
事件
+---------------+-------------+
| EventID (PK) | RiskID (FK) |
+---------------+-------------+
我会添加几个桥梁 tables 以便每个项目 kann 都有很多风险和多极事件
我不太清楚为什么你有另一个主唯一键,但好吧 evrybiody 可以做他们喜欢的事
每一列应该只有一个
项目
Proj_IG(PK) | Project_ID(KEY)
event_project
Project_ID(FK) | Envent_ID(FK
事件
Evnt_ID | Envent_ID....._
如果事件项目和风险是相互的,你可以用三个柱子做一个桥table,所以一个项目也可以有多个事件和风险,但它们都连接在桥上table yan 表示
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