gpt4 book ai didi

database-design - 发现父类(super class)表中一行的子类

转载 作者:行者123 更新时间:2023-12-04 07:06:22 25 4
gpt4 key购买 nike

我有一个用作通用父类(super class)的电子设备表,然后是电话、笔记本电脑、相机等的单独子类表,这些表扩展了父类(super class)并提供有关设备的特定信息(使用父类(super class)表中的外键 deviceID),换句话说,Class Table Inheritance .我的问题是,我应该在父类(super class)中有一个“deviceType”列吗?这将是多余的,因为您可以通过查看特定 deviceID 出现在哪个子类表中来发现设备类型,但这似乎是不必要的连接数量来找出如此简单的东西。

一般来说,有人看着随机的通用设备并想知道它是什么类型可能是不寻常的,但将设计留在那个人很难轻易发现的地方似乎也很奇怪。

另一个问题是约束......我如何约束它以便设备只被子类型化一次?就像在,什么是阻止将一行添加到笔记本电脑表中,该行与相机表中已经存在的行具有相同的设备 ID?同样,即使使用良好的 UI,这也不太可能实现,但数据库约束总是可取的。

谢谢!

附言如果我们确实使用 deviceType 列,为了帮助数据完整性,它将链接到我们支持的所有设备类型的枚举表,而不是自由文本字段。

添加澄清



首先是父类(super class)表:

通用设备

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 制造并于 09 年 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 字段,一次只是因为 Laptop 表中有一行 deviceID = 1。

最佳答案

"but that seems like it would be an unnecessary amount of joins to find out something so simple."



你说对了。

我一直在你的鞋子里,幸运的是我还在这个网站上做了书签,以防我需要再次引用它。它甚至包括有关如何设置您正在寻找的约束的信息。

假设您使用的是 SQL Server,请执行以下操作:
Implementing Table Inheritance in SQL Server

关于database-design - 发现父类(super class)表中一行的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1088600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com