Database design 将外键链接到多个表的规则

Database design 将外键链接到多个表的规则,database-design,orm,doctrine-orm,Database Design,Orm,Doctrine Orm,我想实现一个通用表,比如info,带有列类型和外部id。外部id是不同表的外键,具体取决于类型 对于ORM,我的理解是您需要提前指定映射关系。但是,由于外部id可以根据类型链接到不同的表。如何使用ORM实现这种关系 目前,我通过创建多个表来解决这个问题,比如info_a,info_b,使用a_id和b_id。如果类型的数量增加,将导致许多表具有基本相似的结构 如何使用ORM解决此问题?提前感谢。您通过接受以下事实来“解决”这个问题:您将拥有多个“结构类似”的表 拥有表格的原因是而不是其结构,拥有

我想实现一个通用表,比如info,带有列类型和外部id。外部id是不同表的外键,具体取决于类型

对于ORM,我的理解是您需要提前指定映射关系。但是,由于外部id可以根据类型链接到不同的表。如何使用ORM实现这种关系

目前,我通过创建多个表来解决这个问题,比如info_a,info_b,使用a_id和b_id。如果类型的数量增加,将导致许多表具有基本相似的结构

如何使用ORM解决此问题?提前感谢。

您通过接受以下事实来“解决”这个问题:您将拥有多个“结构类似”的表

拥有表格的原因是而不是其结构,拥有表格的原因是它们(及其内容)对最终用户的意义

因此,关于拥有多少个表的决定,首先应该由它们对用户的意义来决定,不同的意义类型会产生不同的表。人们普遍认为两张表“结构相同”,因此应该合并为一张表,但这是一个严重的错误


帮你自己一个忙,学会/接受“通用表”不好的反射。

你没有多个外键。你有一些让人想起FKs的东西。FK是一个列集,其子类型值也始终位于另一个表中,在该表中,列构成候选键。正如所评论的,您的设计是反模式的,因为它不必要地复杂。SQL不容易支持其完整性或优化

与表信息中的列type和foreign_id[sic]不同,在表信息中type value表示它必须作为id值出现在哪个其他表中,可以直接为类型中允许的每个值设置一个表值info,并将FK foreign_id设置为适当的值\u other table id

但是,您真正需要的可能是每个值或其他表的外来id列都是FK引用信息。你可能想让FK走另一条路。当info(id,type,…)表示“thing[id]属于子类型[type]和…”,VALUE_other(foreign_id,…)表示“thing[foreign_id]属于子类型VALUE和…”时会发生这种情况。请注意,专有名称是thing_info(id,type,…)和VALUE_thing_info(id,…)。您可能不再需要类型。类似于此的内容可能都是由明确支持“子类型”或“多态性”的ORM自动设置的


如果这符合您的需要,那么在这种特殊的子类型情况下,因为您能够让每一行信息都有一个外来的\u id FK到一个值\u其他表,这意味着每一个事物都恰好是一个子类型。对于最多一个子类型,您可以为每个值\u事物\u信息表编写一个SQL约束,使事物\u信息中的一个id匹配行具有一个属性值的类型值。(从技术上讲,类型在数据库中仍然是冗余的,但它有助于提高清晰度和效率。)您可以编写一个SQL约束,使thing\u info id值与value\u thing\u info id值并集。(一些这样的约束可以是声明性的。在thing\u info中输入类型有助于实现这一点。将type也放在VALUE\u thing\u info表中是另一个更冗余的习惯用法,但也有助于更具声明性。尽管更新约束可以更快。)

将外键映射到多个表是数据库设计中的一种反模式。请参阅。谢谢您的回复。我认为保持代码干燥是很好的。这不应该也适用于数据库结构吗?不。数据库结构不是代码。请参阅。表的“结构”是“一组孔”但是你可以有多个不同的谓词(=多个不同的外部含义)和完全相同的“洞集”。