【问题标题】:What's the best way to design multiple 1 to 1 relation within Postgre在 Postgre 中设计多个 1 对 1 关系的最佳方法是什么
【发布时间】:2018-02-15 15:36:34
【问题描述】:

我想知道在 Postgre 中是否有更好的方法来设计这种关系:

基本上,我有一些实体是EntityAEntityBEntityC。我将在实体和其他东西之间有很多其他关系(例如Comment 在这种情况下)所以我有这个通用的Entity 定义它链接到的Entity 的类型。

例如,如果我们将 EntityA 链接到评论,则 Entity 条目将如下所示: type: EntityA entity_a_id: x entity_b_id: null entity_c_id: null

有更好的设计方法吗?

【问题讨论】:

  • 实体表中的记录可以有a、b、c ID吗?
  • 是的,一次只有一个(在type字段中定义)
  • 这会在以后给你带来很大的痛苦——你最终会编写每次从实体连接到实体 A B 和 C 的语句,因为它必须涵盖任何场景。它们应该位于不同表上而不是托管在单个表上的实体有多大不同?
  • ?所以不,Entity表中的一条记录不能同时有a、b和c。尽管this link 侧重于SqlServer 和C# 代码,但用于对多个子类的继承进行建模的选项通常是每个类型的表(您所做的那种)和每个层次结构的表(包含所有内容的大胖表)。但是您不会在基表中拥有类型鉴别器和实体子类 id - 您可以在子类表上共享相同的实体 id 主键。
  • 在这种情况下,这是一种糟糕的建模方式。提供一些表格中的示例数据。

标签: sql database postgresql database-design


【解决方案1】:

这似乎很适合 Table Inheritance 功能

CREATE TABLE entity (
  -- columns that are shared among all entities
);

CREATE TABLE entity_a (
  -- columns that are unique for this entity type
) INHERITS (entity);

CREATE TABLE entity_b (
  -- columns that are unique for this entity type
) INHERITS (entity);

这样,实体类型不包含其他类型的列

【讨论】:

  • 我无法一次列出所有可用实体并通过 ID 识别它们。其中一个用例是在 Facebook 上提及其中一个实体,例如 @ ,所以我需要一个包含每个实体的唯一 ID 的列表
【解决方案2】:

实体有何不同?

为什么不直接

CREATE TABLE Entity
(
    EntityId int,
    EntityType enum(A, B, C),
    FieldValue varchar(255)
) 

或者如果字段值显着不同并且在单个列中没有意义,

CREATE TABLE Entity
(
    EntityId int,
    EntityType enum(A, B, C),
    FieldValueX varchar(255),
    FieldValueY varchar(255),
    FieldValueZ varchar(255)
) 

【讨论】:

  • 我不想最终得到一个包含多个无用字段的巨大表,具体取决于所代表的实体。实际上会有 5 个完全不同的实体,至少有 10 个唯一字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2021-02-16
相关资源
最近更新 更多