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


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

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

想法1: 制作一张动物桌,并且桌子有类型,找到什么样的动物,如果它是一只狗,只需从狗桌上得到结果。

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

类型: 狗:0 鱼:1

狗: TailLength:INT

鱼: 重量:INT

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

狗: 颜色:字符串 TailLength:int

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


11355
2017-07-05 16:19


起源



答案:


你提到的两种方法:

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

可以由另外两个补充:

  • 继承层次结构中每个类的一个表 - 您现在有一个 动物 table和子类具有带外键的表,这些外键指向其中的公共数据集 动物
  • 通用模式 - 具有用于存储对象的表,以及用于支持附加到该对象的任何属性集的属性表。

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

另请查看以下SO主题:

最后,应该指出的是 面向对象的数据库 (也就是对象数据库,或OODBMSes)那些在数据库中更自然地表示对象,并且可以轻松地解决这个问题,尽管我不认为它们在行业中经常使用。下面是一些描述此类数据库的链接,与关系(和其他)数据库相比,尽管它们不会完全提供给您 目的 (heh)对此事的看法:


12
2017-07-05 16:50





你可以这样试试:

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)

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


0
2017-07-05 16:29





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

   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)

0
2017-07-05 16:30