如何在一对多关系中引用实际值

Posted

技术标签:

【中文标题】如何在一对多关系中引用实际值【英文标题】:How to reference the actual value in a one to many relation 【发布时间】:2021-11-16 09:31:22 【问题描述】:

我有两张桌子,piratesbounties

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 的单个海盗有关。现在,您说您希望每个海盗与可能称为“当前赏金”的单个赏金有另一种关系;如果是这种情况,您的第一个解决方案将起作用(第一个表中的 bountiebounty_id 列)。正如你所说,这个 FK 也需要延期。 PostgreSQL 和 Oracle 仅支持 afaik。 是的,因为我需要知道这个海盗的实际赏金是什么。 我编辑了最后一张表,我犯了一个错误,把 is_actual 放在了错误的表上 “因为我需要跟踪所有以前的赏金” - 这是否意味着只有最近的赏金是“当前/实际”赏金?你关心那个历史/顺序吗?您可以将timestamp 添加到bounties 表中。当前的赏金只是pirate 和最新的timestamp 的一个。 我想通过最新添加的来获得当前的赏金,但我害怕将来遇到问题,也不会像这样搜索而不是直接参考当前的一个?是的,我确实关心其他赏金和他们的顺序 【参考方案1】:

我将创建一个匹配海盗 ID 和赏金 ID 的表。 这样,您可以随着时间的推移更改规则(一个海盗有几个赏金或一个赏金几个海盗,你的选择)。随着时间的推移,您将获得更大的灵活性。

如果赏金包含大量您不想复制的数据,而另一名海盗随后获得相同的赏金,则特别有用。您只会在链接表中创建具有两个 ID 的行。

【讨论】:

以上是关于如何在一对多关系中引用实际值的主要内容,如果未能解决你的问题,请参考以下文章

如何在核心数据中以一对多关系链接现有值?

数据库中根据数据一对一,一对多,多对多关系设计

一对多、自引用关系 Symfony

实体有两个属性,它们都在一对多关系中引用相同的实体类型

SQLAlchemy 一对多关系澄清

EclipseLink 不删除私有的一对多项目