如何解决考虑具有两个外键的一对多或多对多关系的正确方法是什么?
user_id (primary key)
...
交易
transaction_id (primary_key)
sender_id (foreign key)
receiver_id (foreign key)
...
应该如何看待这个问题?通常在一对多中,我会说,“一个用户可以有很多交易,但一个交易只能有一个用户。”在这种情况下,一个交易需要两个用户。这是否是多对多?
解决方法
每对表之间可以有多种关系是很正常的。你应该分别说出每一个。
在这种情况下,您有两个一对多关系。我见过五六个案例。
比如有一个要求,支付记录需要包含所有参与其中的用户,解决方法是在user表中添加6个外键:
- 谁输入了付款。
- 谁验证过。
- 谁授权的。
- 对于超过 1 万美元的付款,有第二个人进行授权。
- 谁处理了每两周一次的付款流程。
- 支票是谁打印的。
该要求需要所有这些用户作为付款记录的一部分。在那里您会看到 payment
和 user
之间的六个 FK。
关系是从一个实体到另一个实体的描述。
在你的例子中,
- 一个用户(来自)有零到多个(0:M)交易(到)
- 一笔交易(发件人)总是有一个(1:1)发送方用户(收件人)
- 一笔交易(来自)总是有一个(1:1)接收方用户(至)
不要在一个陈述中描述关系的两端,因为这可能会导致混淆或忽略细节。如果您切换“来自”实体,您实际上是在讨论不同的关系。
顺便提一下,我建议您将列命名为 sender_userId/receiver_userId 或类似名称。包含相关实体名称可以帮助稍后浏览您的结构。随着设计内容的增长,sender_id/receiver_id 可能不会明显指向 User 实体。之后的开发者可能会开始寻找发送者实体等。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。