数据库专家您好!
我正在设计一个小型数据库并遇到这样的情况,即两个外键在同一个表中,根据不同的操作引用父表中的不同行。让我解释。
最典型的N:M
关系示例是学生注册课程、产品被标记、租户租用公寓等。但所有这些都只描述了一个动作(注册、标记、租用等),所以当两个不同的动作被执行时会发生什么同一个子表?例如,正在发送和接收的消息。
假设我们有两个表,users
并且messages
我们有以下业务逻辑:
一个用户可以发送和接收多条消息。
一条消息由用户发送并由另一用户接收。
因此,该message
表将有 2 个外键,sender_id
并且 receiver_id
,两个用户。
这是我感到困惑的地方。我们可以创建一个带有外键的连接表,user_id
但message_id
用户 X 发送的消息和用户 Y 接收的消息将全部保存在同一个表中,我不知道这是否正确(不是焦点表)。
messages
我们应该在表中保留两个外键吗?
我在发布这个问题之前进行了搜索,我有两个链接
在这里人们说我们应该为N:M
关系创建连接表,但同样是执行一个操作的示例。
在这里,人们似乎对子表的两个外键的想法很满意。
设计这样的关系的正确方法是什么?
简短的回答 - 是的。
每条消息都有一个发件人,该发件人必须是有效用户。
每条消息都有一个接收者,它必须是有效的用户。
因此,这些字段中的每一个都需要用户表的外键,如下所示: