我有一个作为通用超类的电子设备表,然后为电话、笔记本电脑、相机等分开子类表,这些表扩展了超类并提供了有关设备的特定信息(使用超类表中的外键 deviceID),换句话说,类表继承。我的问题是,我应该在超类中有一个“deviceType”列吗?这将是多余的,因为您可以通过查看特定 deviceID 出现在哪个子类表中来发现设备类型,但这似乎是不必要的连接数量来找出如此简单的东西。
一般来说,一个人看到一个随机的通用设备并想知道它是什么类型可能是不寻常的,但将设计留在那个人很难轻易发现的地方似乎也很奇怪。
另一个问题是约束......我如何约束它以使设备仅被子类型化一次?例如,如何阻止将具有相同设备 ID 的行添加到膝上型计算机表中,因为该行与 Camera 表中已经存在的行相同?同样,这在良好的 UI 中是不可能实现的,但数据库约束总是更可取的。
谢谢!
PS 如果我们确实使用 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 英寸屏幕的笔记本电脑,而佳能和 Ikon 设备都是分别具有 6.5 和 8 兆像素的相机。
问题是如果你一开始不知道设备是什么类型,而你所拥有的只是 GenericDevice 表中的一行。我们以第一行为例。您知道该设备由 HP 制造并于 2009 年 5 月 6 日发货,但您最初并不知道它是什么类型的设备。但是您可以通过搜索子表来找出它,直到找到 deviceID = 1 的行。笔记本电脑表包含这样一行,因此 HP 设备实际上必须是那台笔记本电脑。但这似乎是简单地发现设备类型的不必要麻烦(特别是如果您必须搜索 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 已切换为相机)
现在您的信息存在冲突 - 上表表明 HP 设备是相机,但在笔记本电脑表中有一行设备。换句话说,您实际上将 HP 设备的类型存储了两次。一次使用 GenericDevice 表中的 deviceType 字段,一次简单地因为膝上型计算机表中有一行 deviceID = 1。