如何在数据库中实现超类,子类关系?

时间:2010-07-05 16:19:56

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

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

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

创意1: 制作动物表,并且桌子有类型,找到什么样的动物,如果它是狗,只是从狗桌得到结果。

动物: 颜色:字符串 类型:整数

类型: 狗:0 鱼:1

犬: TailLength:INT

鱼: 重量:INT

创意2: 只在数据库中存储Dog表和Fish表,删除动物表。

犬: 颜色:字符串 TailLength:int

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

3 个答案:

答案 0 :(得分:12)

您提到的两种方法:

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

可以由另外两个补充:

  • 继承层次结构中每个类的一个表 - 您现在有一个 Animal 表,子类具有外键的表,这些外键指向 Animal
  • 通用架构 - 具有存储对象的表,以及支持附加到该对象的任何属性集的属性表。

每种方法都有利有弊。这里有一个很好的概述:

另请参阅以下SO主题:

最后,应该注意的是,有面向对象的数据库(又名对象数据库,或OODBMS),它们在数据库中更自然地表示对象,并且可以轻松解决这个问题,尽管我不认为它们在行业中经常使用。下面是一些描述此类数据库的链接,与关系(和其他)数据库相比,虽然它们不会在这个问题上给出完整的目标(heh)视图:

答案 1 :(得分:0)

你可以这样试试:

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)

通过这种方式,每只动物可以拥有一个或多个属性(由您自行决定)。

答案 2 :(得分:0)

使用一对一或零关系正如您所注意到的那样,在数据库架构设计语言中,这些表称为class - sub-class或superclass

   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)