首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三个相关表的数据库表设计重组

问三个相关表的数据库表设计重组
EN

Stack Overflow用户
提问于 2021-08-24 22:12:38
回答 3查看 109关注 0票数 0

我有三张桌子需要像这样连接:

代码语言:javascript
复制
Event(RiskID) -> Risk(RiskID)
Risk(ProjectID) -> Project(ProjectID) 
Event(ProjectID) -> Project(ProjectID)

使用这些表格:

项目表

代码语言:javascript
复制
+------------+-----------+
|   ID       | ProjectID |            
+------------+-----------+

和下面两个表,我试图通过一个外键约束链接

风险

代码语言:javascript
复制
+------------+-----------+------------+
|  ID        | ProjectID | RiskID     |
+------------+-----------+------------+

事件(又名风险缓解事件,每个风险多个事件,每个项目多个风险)

代码语言:javascript
复制
+------------+-----------+------------+-------+
|  ID        | ProjectID | EventID    | RiskID|
+------------+-----------+------------+-------+

根据我目前对关系数据库(如MySQL )的理解,要创建外键,我应该在链接表中使用一个主键到需要引用值的表,并执行引用完整性。如果所有三个表都有重复的值,即属性集{ProjectID,EventID}是这样的,因为我的所有表都有用于跟踪更改的特定于历史的列信息,那么如何完成此约束?

这种方法让我对在这种情况下如何创建外键产生了一些疑问。如何使用外键内的ID,但仍然使用{ProjectID、EventID} {ProjectID、RiskID} together...etc.

如果我的术语偏离了人们的理解,我可以修改或澄清。希望我的问题(关于外键这个话题)有一个共同的解决方案吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-08-24 22:59:10

我会添加几个桥牌,这样每个projet都有许多风险和多极事件。

我不太清楚你为什么有另一个主键,但是好的,每个人都可以做他们喜欢做的事。

每一列都应该只有一列。

项目

代码语言:javascript
复制
Proj_IG(PK) | Project_ID(KEY)

event_project

代码语言:javascript
复制
Project_ID(FK) | Envent_ID(FK

事件

代码语言:javascript
复制
Evnt_ID | Envent_ID....._

如果事件项目和风险是相互喜欢的,您可以用三列来制作一个桥表,一个项目也可以改变事件和风险,但是tas tehy都是相结合的。

risk_project

代码语言:javascript
复制
RIsk_ID Projekt_ID

风险

代码语言:javascript
复制
    R_ID | Risk_ID

项目

代码语言:javascript
复制
Proj_IG(PK) | Project_ID(KEY)

event_risk项目

代码语言:javascript
复制
Project_ID(FK) | Envent_ID(FK) | Risk_ID(FK)

事件

代码语言:javascript
复制
Evnt_ID | Envent_ID....._

风险

代码语言:javascript
复制
    R_ID | Risk_ID
票数 1
EN

Stack Overflow用户

发布于 2021-08-24 22:17:04

外键不需要指向主键

如果确实希望为非主键创建外键,则必须是对其具有唯一约束的列。

这个线程更显式一些Foreign Key to non-primary key。

票数 1
EN

Stack Overflow用户

发布于 2021-08-24 22:22:49

Event.ProjectID是冗余的,违反了第三范式。由于给定的风险只引用一个项目,所以如果引用一个项目,但又引用了一个引用不同项目的风险,则可以在事件表中创建异常。事件真正属于哪个项目变得模棱两可。

看起来每个表中都有多余的Id。Project.Id和Project.ProjectId有什么区别?Risk.ProjectId应该参考哪一个?对Project.ProjectId是否有唯一的约束?

通常,如果可能的话,每个表只会生成一个唯一的键,并且它将是主键。

所以你最终会得到这样的东西:

代码语言:javascript
复制
Event(RiskID) -> Risk(RiskID)
Risk(ProjectID) -> Project(ProjectID) 

项目

代码语言:javascript
复制
+----------------+
| ProjectID (PK) |            
+----------------+

风险

代码语言:javascript
复制
+--------------+----------------+
|  RiskID (PK) | ProjectID (FK) |
+--------------+----------------+

事件

代码语言:javascript
复制
+---------------+-------------+
|  EventID (PK) | RiskID (FK) |
+---------------+-------------+
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68914649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档