如何在 SQL 中对多对多实体关系进行通用建模?

问题描述 投票:0回答:1

我有一个用于维护 D&D 游戏的 SQL 数据库,其中包含角色、物品和位置等表格。我想开始对所有这些不同实体类型之间的关系进行建模,例如角色与另一个角色的关系,或者角色与特定项目或位置的关系,本质上是创建一个游戏中所有内容如何链接的图表一起。

我尝试的最初是从角色关系的角度出发,创建一个多对多的联接表,如下所示:

CREATE TABLE character_relationships (
    character_id_from UUID REFERENCES characters(id),
    character_id_from_id_to UUID REFERENCES characters(id),
    relationship_type TEXT,
    opinion TEXT,
    -- Additional relationship-specific attributes
);

但是,如果我希望能够对任何实体类型(例如角色到项目,或项目到位置)的关系进行通用建模,处理此问题的最佳方法是什么?

我想我可能需要创建一个名为 Entity 的“超类”表,该表首先插入以检索 ID,然后用于插入到子类字符、项目和位置表中,生成的连接表如下这个:

CREATE TABLE entity_relationships (
    entity_id_from UUID REFERENCES entities(id),
    entity_id_from_id_to UUID REFERENCES entities(id),
    relationship_type TEXT,
    opinion TEXT,
    -- Additional relationship-specific attributes
);

这是设计通用关系的最佳方法吗?或者除了为每种关系类型创建多个表之外还有其他选择吗?这样做的潜在缺点是什么?

sql database postgresql database-design
1个回答
0
投票

但是如果我想能够对关系进行通用建模 从任何实体类型,例如字符到项目或项目 到地点,处理这个问题的最佳方法是什么?

如果不需要,请不要去更高级别,保持具体:只需为每个此类关系创建一个“连接表”。语义保持直接和清晰(您可以看到实际存在的实体),您的查询也保持简单明了,定义约束也保持简单。

我想我可能需要创建一个名为 Entity 的“超类”表, [...] 这样做的潜在缺点是什么?

缺点是这与上面相反,它在各个级别上都非常复杂,实际上通常负责 DBMS 的大多数逻辑都必须手动编码,直到使用触发器来确保数据库的一致性关系(以确保 relationship_type 与引用的实体兼容,等等)。因此,除非域确实具有实体类型的open集合,否则这根本不是可行的方法。

© www.soinside.com 2019 - 2024. All rights reserved.