如何在一对多关系中引用实际值
Posted
技术标签:
【中文标题】如何在一对多关系中引用实际值【英文标题】:How to reference the actual value in a one to many relation 【发布时间】:2021-11-16 09:31:22 【问题描述】:我有两张桌子,pirates
和 bounties
。
Pirate | Bounties |
---|---|
id | id |
name | value |
. | pirate_id |
一个海盗可以有很多赏金,但一个赏金只能有一个海盗。问题是,我需要知道实际的赏金是多少,因为我需要跟踪所有以前的赏金。
我的解决方案是创建一个带有延迟约束FK
的循环引用,所以我的表会是这样的:
Pirate | Bounties |
---|---|
id | id |
name | value |
bounty | pirate_id |
或者我可以添加一列来检查该赏金是否是实际的:
Pirate | Bounties |
---|---|
id | id |
name | value |
. | pirate_id |
. | is_actual |
最好的方法是什么?有什么建议吗?
【问题讨论】:
不确定我是否理解。每个赏金都与pirate_id
FK 的单个海盗有关。现在,您说您希望每个海盗与可能称为“当前赏金”的单个赏金有另一种关系;如果是这种情况,您的第一个解决方案将起作用(第一个表中的 bountie
或 bounty_id
列)。正如你所说,这个 FK 也需要延期。 PostgreSQL 和 Oracle 仅支持 afaik。
是的,因为我需要知道这个海盗的实际赏金是什么。
我编辑了最后一张表,我犯了一个错误,把 is_actual 放在了错误的表上
“因为我需要跟踪所有以前的赏金” - 这是否意味着只有最近的赏金是“当前/实际”赏金?你关心那个历史/顺序吗?您可以将timestamp
添加到bounties
表中。当前的赏金只是pirate
和最新的timestamp
的一个。
我想通过最新添加的来获得当前的赏金,但我害怕将来遇到问题,也不会像这样搜索而不是直接参考当前的一个?是的,我确实关心其他赏金和他们的顺序
【参考方案1】:
我将创建一个匹配海盗 ID 和赏金 ID 的表。 这样,您可以随着时间的推移更改规则(一个海盗有几个赏金或一个赏金几个海盗,你的选择)。随着时间的推移,您将获得更大的灵活性。
如果赏金包含大量您不想复制的数据,而另一名海盗随后获得相同的赏金,则特别有用。您只会在链接表中创建具有两个 ID 的行。
【讨论】:
以上是关于如何在一对多关系中引用实际值的主要内容,如果未能解决你的问题,请参考以下文章