数据库表中的循环引用

Posted

技术标签:

【中文标题】数据库表中的循环引用【英文标题】:Cyclic reference in a database table 【发布时间】:2011-01-12 14:56:14 【问题描述】:

我很惭愧地问这个问题,但最近出现了一种情况,我需要为三种不同类型的相互关联的银行实体创建一个表。让我解释一下。

想象一个 BANK 表,其中包含管理银行或经营农村分行的普通银行,或在该银行下运营的农村分行或不属于此层次结构但仅与农村进行交易的零售银行分行的详细信息分支。

之前,我决定为这些设置 4 个不同的表,并具有 FK 约束(即,管理银行、经营农村分行的银行、农村分行和零售银行分行各一个)。但是当我继续创建 TRANSACTION 表时,我感到很困惑,因为交易可能发生在任何这些实体之间(例如:农村分支机构和零售分支机构之间,农村分支机构之间等)。这意味着我不仅需要记录银行实体的“源”和“目标”ID,还需要保留一些数据来帮助应用程序逻辑确定要加入哪个表以进行查询。我觉得那是不好。

此外,还有一个 USER 表,用户可以属于这些实体中的任何一个,这里也有 4 个不同的银行实体表是有问题的。我如何知道用户属于农村分行、零售分行还是管理银行?

因此,我创建了一个 BANK 表(主要是因为它们是相似的实体,因为它们可以相互交易)。我在表中添加了一个 PARENT 列,该列将保存父机构的 ID 值(我使用 FK 实现的关系)。因此,农村分行将在其父列中具有运营银行的 ID。零售分行没有父级,因此那里的值为 NULL,依此类推。

我现在看到的问题是BANK表中有PK/FK关系,循环引用。

我的问题是:这有多糟糕?什么是出路?

【问题讨论】:

【参考方案1】:

拥有自我参照关系并不少见。一个缺点是许多 RDBMS 不允许您对自引用关系执行级联删除。除此之外,这种等级关系并没有什么大的陷阱。许多数据库解决方案甚至支持扩展功能以促进这种类型的关系。

请参阅 this article,了解如何使用 Common Table Expressions 执行分层查询。 请参阅this mysql article,详细了解自引用关系中使用的一些查询。

此外,我是否建议您使用此 Bank 表,但保留银行类型的辅助表,以便每家银行在 Bank 表中都有一条记录,并且在其他其中一个表中也有一条记录银行类型特定的扩展属性。这样,关系仍然是集中的,用户仍然可以使用单个 FK 绑定到 Bank 表,但您的 Bank 表不会被所有不同银行类型的扩展属性混淆。

【讨论】:

以上是关于数据库表中的循环引用的主要内容,如果未能解决你的问题,请参考以下文章

为啥iOS的Masonry中的self不会循环引用

循环中的C ++对象引用[重复]

怎么取消循环引用警告

jmeter循环读取数据库表中的数据

如何检测链表中的循环?

VBA循环使用另一张表中的数据更新图表中的系列