问题描述
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 实体。之后的开发者可能会开始寻找发送者实体等。