假设我有一张可能有零或多个回复的票证/问题。
我可以通过两种方式联系'回复'和'票'表。
第一种方法:
Ticket(**ticket_id**, title, message) //ticket_id: PK
Reply(**reply_id**, reply_message, ticket_id) //reply_id: PK and ticket_id: FK
第二种方法:
Ticket(**ticket_id**, title, message) //ticket_id: PK
Reply(**reply_id**, **ticket_id**, reply_message) //reply_id: PK and ticket_id: FK & PK
在我看来,两者都是正确的。
正如我所看到的,第二种方法中的回复被认为是弱实体,因为回复与票证密切相关。但是,我更喜欢第一种方法,因为它更容易在编程层面处理;在第一种方法中,我们只需要处理一个PK。 你同意吗?为什么和为什么不呢?。
注意:票证和回复是模拟样本。
答案 0 :(得分:0)
正如我所看到的,第二种方法中的回复被认为是弱实体......
正确。
...因为回复与票证密切相关。
不确定你的意思。它很弱,因为如果没有从父级迁移的属性,它就无法识别。
但是,我更喜欢第一种方法,因为它更容易在编程层面处理;在第一种方法中,我们只需要处理一个PK。你同意吗?为什么和为什么不呢?。
嗯,这取决于;)
强大的实体和非识别关系(您的“第一种方法”):
弱实体和识别关系(你是“第二种方法”):
总而言之,这两种解决方案都不是“更好” - 这是选择正确平衡的问题。
1 在您的案例中尚未(尚)相关,因为您(还)没有任何引用Reply
的表格。
2 许多(但不是全部)DBMS只允许在PK上进行群集。在您的情况下,在{ticket_id, reply_id}
上进行聚类(请注意字段的顺序)会将所有连接到相同滴答的回复存储在一起,从而大大减少了某些类型查询的I / O.
3 在从Ticket
删除或修改行时,有效实施参照完整性是必要的。
4 假设您将订单更改为{ticket_id, reply_id}
。