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

Tat*_*tat 11 database database-design class-table-inheritance

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

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

想法1:制作动物表,并且表格有类型,以找到什么样的动物,如果是狗,只需从狗桌得到结果.

Animal:color:String类型:int

类型:狗:0鱼:1

狗:TailLength:int

鱼:重量:int

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

狗:颜色:字符串TailLength:int

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

Owe*_* S. 12

你提到的两种方法:

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

可以由另外两个补充:

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

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

另请查看以下SO主题:

最后,应该注意的是,有一些面向对象的数据库(也就是对象数据库或OODBMS)可以更自然地在数据库中表示对象,并且可以很容易地解决这个问题,尽管我认为它们并不常见用于工业.下面是一些描述此类数据库与关系(和其他)数据库相比较的链接,但它们不会给出完全客观(heh)的观点:


归档时间:

查看次数:

12061 次

最近记录:

7 年,9 月 前