【问题标题】:How to design my database with special relations?如何设计我的特殊关系数据库?
【发布时间】:2016-07-10 09:57:38
【问题描述】:

嗯,我的数据库真的很特别。我不知道如何设计的部分是下一个:

我需要一个实体“扫描”,它将包含另一个实体的 FK。

问题是“其他实体”可能来自不同的实体:Type1Entity、Type2Entity、Type3Entity,这些实体之间没有任何关系。

这是一个多对一的关系。

例如,我想要 2 个实体“扫描”: - 一个对 Type2Entity 具有 FK,第二个对 Type3Entity。

有人对我有什么想法吗?

顺便说一句,我不想​​这样做:

使用 3 FK 的“扫描”表: Type1EntityID Type2EntityID Type3EntityID 和 3 个中的 2 个为空值。

非常感谢!

【问题讨论】:

    标签: sql sql-server database database-design foreign-keys


    【解决方案1】:

    首先,您的数据库设计很差。您不应该为不同类型的Entity 使用不同的表。而是为您的所有Entity 创建一个包含EntityTypeId 列的表。然后为EntityType 创建另一个表。像这样:

    Entity
        Id              INT
        EntityTypeId    INT
        --Other columns
    
    EntityType
        Id      INT 
        --Other columns
    
    Scan
        Id          INT
        EntityId    INT
        --Other columns
    

    然后您可以在ScanEntityId 上进行 FK。

    【讨论】:

      【解决方案2】:

      大多数时候,您可以合并这些实体表并使用一个辅助字段来区分它们。

      如果您不能这样做,在大多数情况下,您的 TypeXEntity 表之间会有一些公共字段。

      如果是这样,一种解决方案是提取这些实体表的公共部分并创建一个新表(称为 EntityTypeCommon)。然后从 EntityTypeCommon 创建 FK 到 Scan 表,然后从各个 Entity 表创建 FK 到 EntityTypeCommon

      Scan(
        Id
        Name
      )
      
      EntityTypeCommon(
        Id
        ScanRef
        ...
      )
      
      Entity1Type(
        Id
        TypeEntityCommonRef
        ...
      )
      
      Entity2Type(
        Id
        TypeEntityCommonRef
        ...
      )
      
      Entity3Type(
        Id
        TypeEntityCommonRef
        ...
      )
      

      【讨论】:

        【解决方案3】:

        Type1、Type2、Type3 等是类/子类的经典案例,或者,如果您愿意,也可以是类型/子类型。这些案例已经深入研究了数十年,您可以从以前的案例中受益。首先,我建议您查看这三个标签,研究问题、答案以及信息选项卡中的描述。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-02-14
          • 1970-01-01
          • 2013-02-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多