我有一个电子设备表,作为一个通用的超类,然后为电话、笔记本电脑、相机等分开子类表,扩展超类并提供设备上的特定信息(使用超类表中的外键设备ID),换句话说,
Class Table Inheritance
. 我的问题是,我应该在超类中有一个“deviceType”列吗?这是多余的,因为你
能够
通过查看特定deviceid出现在哪个子类表中来发现设备类型,但这似乎是为了找到如此简单的内容而进行的不必要的连接量。
一般来说,有人看到一个随机的通用设备并想知道它是什么类型,这可能是不寻常的,但把设计留在一个很难让人轻易发现的地方似乎也很奇怪。
另一个问题是约束…如何约束它,使设备仅为子类型一次?如中所述,如何阻止将与相机表中已存在的行具有相同设备ID的行添加到笔记本电脑表中?同样,对于一个好的用户界面,这是不可能实现的,但是数据库约束总是更好的选择。
谢谢!
另外,如果我们使用deviceType列来帮助数据完整性,它将链接到我们支持的所有设备类型的枚举表,而不是自由文本字段。
增加澄清
第一个是超类表:
通用设备
deviceID brand shipDate
1 HP 05/06/09
2 Canon 11/16/08
3 Ikon 02/27/09
下面是两个示例子类:
笔记本电脑
laptopID deviceID screenSize
1 1 17
照相机
cameraID deviceID megapixels
1 2 6.5
2 3 8
注意genericdevice表中“deviceid”的迁移键。这允许从通用表到任何子类表的一对一关系,具体取决于它实际是什么类型的设备。因此,您可以加入这些表格,看看HP设备是一台具有17英寸屏幕的笔记本电脑,而Canon和Ikon设备都是分别具有6.5和8百万像素的摄像头。
问题是,如果您首先不知道设备是什么类型的,那么您所拥有的只是genericdevice表中的一行。让我们以第一行为例。你知道这台设备是由惠普公司生产的,于2009年5月6日发货,但你最初并不知道它是什么类型的设备。但是,您可以通过搜索子表,直到找到deviceid=1的行来解决这个问题。笔记本电脑桌上有这样一行,所以惠普设备实际上必须是那台笔记本电脑。但是,这似乎是发现设备类型的不必要的麻烦(特别是如果您有20多个子类,您必须通过搜索来查看deviceid匹配的位置)。相反,你可以这样做:
通用设备
deviceID brand shipDate deviceType
1 HP 05/06/09 laptop
2 Canon 11/16/08 camera
3 Ikon 02/27/09 camera
现在,您可以立即看到HP设备的类型。但是现在您有了重复的数据(隐式地)。要了解原因,请考虑用户是否进行了此更改:
通用设备
deviceID brand shipDate deviceType
1 HP 05/06/09 camera
2 Canon 11/16/08 camera
3 Ikon 02/27/09 camera
(第一行的deviceType已切换到camera)
现在,您有了相互冲突的信息-上表显示HP设备是一个摄像头,但在笔记本电脑表中有一行用于该设备。
换句话说,您有效地将HP设备类型存储了两次。
一次使用genericdevice表中的deviceType字段,一次简单地通过这样一个事实:在deviceid=1的膝上型电脑表中有一行。