【问题标题】:How to implement a super class, sub class relationship in the database?如何在数据库中实现超类、子类关系?
【发布时间】:2010-07-05 16:19:56
【问题描述】:

如果我有一个类叫做动物,狗和鱼是子类。 动物具有称为“颜色”的属性。 狗有“尾长”这个属性,鱼没有这个属性。 鱼有“体重”这个属性,狗没有这个属性。

所以,我想设计一个数据库来存储这些信息。我该怎么办?以下是一些想法:

想法 1: 制作一个动物表,表有类型,查找是什么动物,如果是狗,就从狗表中得到结果。

动物: 颜色:字符串 类型:int

类型: 狗:0 鱼:1

狗: 尾长:int

鱼: 重量:int

想法 2: 数据库中只存储 Dog 表和 Fish 表,删除 animal 表。

狗: 颜色: 字符串 尾长:int

鱼: 颜色: 字符串 重量:int

【问题讨论】:

    标签: database database-design class-table-inheritance


    【解决方案1】:

    你提到的两种方法:

    • 一个表表示整个继承层次结构中的对象,其中包含整个层次结构所需的所有列以及用于告诉您特定对象是哪个子类的“类型”列。
    • 继承层次结构中的每个具体类都有一个表,具有重复的架构。

    可以由另外两个补充:

    • 您的继承层次结构中的每个类都有一个表 - 您现在有一个 Animal 表,子类的表具有指向 Animal中公共数据集的外键>.
    • 通用模式 - 有一个表来存储对象,以及一个属性表来支持附加到该对象的任何属性集。

    每种方法都有优点和缺点。这里有一个很好的概要:

    还可以看看这些 SO 主题:

    最后,应该指出的是,面向对象的数据库(也称为对象数据库,或 OODBMS)可以更自然地表示数据库中的对象,并且可以轻松解决这个问题,尽管我不认为它们在行业中被频繁使用。以下是一些描述此类 DB 与关系(和其他)DB 相比的链接,尽管它们不会为您提供关于此事的完全客观(呵呵)观点:

    【讨论】:

      【解决方案2】:

      你可以这样试试:

      Animal
          PK animal_id
          FK animal_type
          STRING animal_name (eg. 'Lassie')
      
      AnimalTypes
          PK animal_type
          STRING animal_type_name (eg. 'Dog')
      
      AnimalAttributes
          PK attribute_id
          STRING attribute_name (eg. 'tail length')
      
      AnimalToAttributes
          PK id
          FK animal_id
          FK attribute_id
          INTEGER value (eg. 20)
      

      这样您可以为每只动物拥有一个或多个属性(由您选择)。

      【讨论】:

        【解决方案3】:

        使用一对零或一关系正如您所注意到的,在数据​​库模式设计语言中,表称为类 - 子类或超类

           Create Table Animal
            (animalId Integer Primary Key Not null,
             Other columns generic to all animals)
        
           Create Table Birds
            (BirdId Integer Primary Key Not Null 
             references Animal(AnimalId),
             -- other columns)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-12-05
          • 1970-01-01
          • 2013-04-18
          • 2010-11-29
          • 1970-01-01
          • 1970-01-01
          • 2019-11-23
          • 2016-07-25
          相关资源
          最近更新 更多