Database design 在超类表中发现行的子类

Database design 在超类表中发现行的子类,database-design,class-table-inheritance,Database Design,Class Table Inheritance,我有一个电子设备表,用作一般超类,然后是电话、笔记本电脑、相机等的单独子类表。这些子类表扩展了超类,并给出了设备的具体信息(使用超类表中的外键deviceID),换句话说。我的问题是,我应该在超类中有一个“deviceType”列吗?这将是多余的,因为您可以通过查看特定deviceID出现在哪个子类表中来发现设备类型,但这似乎是不必要的连接量,无法找到如此简单的东西 一般来说,有人看着一个随机的通用设备,想知道它是什么类型的,这可能是不寻常的,但把设计放在一个人很难轻易发现的地方似乎也很奇怪 另

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

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

另一个问题是约束。。。如何约束它,使设备仅被子类型化一次?如中所示,如何阻止使用与相机表中已存在的行相同的设备ID将行添加到笔记本电脑表中?同样,即使有一个好的UI,这也不可能实现,但数据库约束总是可取的

谢谢

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

补充说明

首先是超类表:

通用设备

deviceID    brand     shipDate
   1        HP        05/06/09
   2        Canon     11/16/08
   3        Ikon      02/27/09
deviceID    brand     shipDate   deviceType
   1        HP        05/06/09      laptop
   2        Canon     11/16/08      camera
   3        Ikon      02/27/09      camera
deviceID    brand     shipDate   deviceType
   1        HP        05/06/09      camera
   2        Canon     11/16/08      camera
   3        Ikon      02/27/09      camera
下面是两个示例子类:

笔记本电脑

laptopID    deviceID    screenSize
   1           1           17
摄像机

cameraID      deviceID     megapixels
   1             2            6.5
   2             3            8
注意GenericDevice表中迁移的键“deviceID”。这允许从泛型表到任何子类表的一对一关系,具体取决于设备的实际类型。因此,您可以加入这些表格,查看HP设备是一台17英寸屏幕的笔记本电脑,而佳能和Ikon设备都是相机,分别具有650万和800万像素

问题是,如果您一开始不知道设备是什么类型的,而您所拥有的只是GenericDevice表中的一行。让我们以第一行为例。您知道该设备由HP制造,并于2009年6月5日发货,但您最初不知道它是什么类型的设备。但您可以通过搜索thr来确定它查找子表,直到找到deviceID=1的行。Laptop表包含这样一行,因此HP设备实际上必须是该笔记本电脑。但是,简单查找设备类型似乎没有必要麻烦(特别是如果您有20多个子类,您必须通过搜索查看deviceID匹配的位置)。相反,您可以这样做:

通用设备

deviceID    brand     shipDate
   1        HP        05/06/09
   2        Canon     11/16/08
   3        Ikon      02/27/09
deviceID    brand     shipDate   deviceType
   1        HP        05/06/09      laptop
   2        Canon     11/16/08      camera
   3        Ikon      02/27/09      camera
deviceID    brand     shipDate   deviceType
   1        HP        05/06/09      camera
   2        Canon     11/16/08      camera
   3        Ikon      02/27/09      camera

现在您可以立即看到HP设备的类型。但是现在您有重复的数据(隐式)。要知道为什么,考虑用户是否做出了这样的改变:

通用设备

deviceID    brand     shipDate
   1        HP        05/06/09
   2        Canon     11/16/08
   3        Ikon      02/27/09
deviceID    brand     shipDate   deviceType
   1        HP        05/06/09      laptop
   2        Canon     11/16/08      camera
   3        Ikon      02/27/09      camera
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字段,一次仅使用i行n在deviceID=1的笔记本电脑表中。

我会在父表中维护一个deviceType列,因为可能有多个设备类型映射到同一子表

我会在任何子表中维护deviceType的副本,这些子表实际上需要它来加快查询速度。我不会认为仅仅为了获取deviceType而与父表进行一点连接会真正降低速度。此外,您可能会使用父表中的许多列,在这种情况下,多出一列不会有任何影响

该副本将在插入和更新时由触发器维护



您提到了更新deviceType导致数据完整性问题的问题,答案是,“不要这样做“。如果设备类型无法更改,则更新触发器不应允许更改。

仅将类型存储在一个表(父表或子表)中,只需选择一个即可。如果你把它放在两个地方,你就必须让它们保持同步,为什么不把所有的子信息都放在父文件中呢?这就更容易了;-)(那是个笑话,不要把所有的东西都放在父表中!)

编辑

我会在GenericDevice表中放入一个Type列,但我会将其设置为代码或数字ID,并将其设置为DeviceType表的FK,而不是像“laptop”或“camera”这样的词。还要确保品牌在品牌表中使用代码或ID和FK

GenericDevice
deviceID    brand     shipDate   deviceType 
1           1         05/06/09   L
2           2         11/16/08   C
3           3         02/27/09   C

DeviceTypes
deviceType   deviceDescription
L            Laptop
C            camera

Brands
BrandID   BrandName
1         HP
2         Canon
3         Ikon
根据不同值的预期数量选择代码/ID数据类型

对于它的价值,您可以这样查询(不使用deviceType列):

“但这看起来像是一场灾难 要查找的连接的不必要数量 我想说一些简单的事情。”

你明白了

我一直站在你的立场上,幸运的是,我仍然把这个网站标记为书签,以防我需要再次引用它。它甚至包括关于如何设置您要查找的约束的信息

假设您使用的是SQL Server,那么:

@JoeCool,父母可以有两种不同类型的孩子吗?如果不是,则类型进入父级,如果是,则进入子级。我见过很多这样的“善意”的例子(在其他表中存储重复的值)会导致更多的问题…@JoeCool,没有表模式和一些数据示例,我只是瞎猜,根据您对表的描述。我不知道你在做什么…这就是我最后要做的。是的,deviceType和Brand都使用ID字段,并链接到如您所述的枚举表。为了问题的清楚,我只是省略了这一点。问题