如果我有一个叫动物的类,狗和鱼是子类。
动物具有称为“颜色”的属性。
狗具有称为“尾长”的属性,并且鱼没有此属性。
鱼有“重量”属性,狗没有这个属性。
所以,我想设计一个数据库来存储这些信息。我该怎么办?这是一些想法:
想法1:
制作一张动物桌,并且桌子有类型,找到什么样的动物,如果它是一只狗,只需从狗桌上得到结果。
动物:
颜色:字符串
类型:int
类型:
狗:0
鱼:1
狗:
TailLength:INT
鱼:
重量:INT
想法2:
在数据库中只存储Dog表和Fish表,删除动物表。
狗:
颜色:字符串
TailLength:int
鱼:
颜色:字符串
重量:int
你提到的两种方法:
- 一个表表示整个继承层次结构中的对象,包含整个层次结构所需的所有列以及一个“类型”列,用于告诉您特定对象的子类。
- 每张一张桌子 具体 继承层次结构中的类,具有重复的模式。
可以由另外两个补充:
- 继承层次结构中每个类的一个表 - 您现在有一个 动物 table和子类具有带外键的表,这些外键指向其中的公共数据集 动物。
- 通用模式 - 具有用于存储对象的表,以及用于支持附加到该对象的任何属性集的属性表。
每种方法都有利有弊。这里有一个很好的概述:
另请查看以下SO主题:
最后,应该指出的是 面向对象的数据库 (也就是对象数据库,或OODBMSes)那些在数据库中更自然地表示对象,并且可以轻松地解决这个问题,尽管我不认为它们在行业中经常使用。下面是一些描述此类数据库的链接,与关系(和其他)数据库相比,尽管它们不会完全提供给您 目的 (heh)对此事的看法:
你可以这样试试:
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)
这样,每只动物可以拥有一个或多个属性(由您自行决定)。
使用一对一或零关系正如您所注意到的,在数据库模式设计语言中,表称为类 - 子类或超类
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)