我有一个电子设备表,作为一个通用超类,然后为电话、膝上型计算机、照相机等单独的子类表扩展超类,并提供设备上的特定信息(使用超类表中的外键deviceID ),换句话说,就是类表继承。我的问题是,我应该在超类中有一个"deviceType“列吗?这将是多余的,因为您可以通过查看特定deviceID出现在哪个子类表中来发现设备类型,但这似乎是不必要的连接量,可以找到这么简单的东西。
一般来说,如果有人看到一个随机的通用设备,并想知道它是什么类型,这可能是不寻常的,但把设计留在一个很难让人轻易发现的地方似乎也很奇怪。
另一个问题是限制..。我如何限制它,使设备只被子类型一次?如图所示,如何阻止将行添加到与摄像机表中已经存在的行相同的deviceID的膝上型计算机表中?同样,如果有一个好的UI,这是不太可能的,但是数据库约束总是更好的。
谢谢!
如果我们确实使用deviceType列来支持数据完整性,它将链接到我们支持的所有设备类型的枚举表,而不是一个自由文本字段。
增加以求澄清
首先是超类表:
GenericDevice
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请注意从deviceID表迁移来的“GenericDevice”键。这允许从泛型表到任何子类表之间的一对一关系,这取决于它实际上是何种类型的设备。所以你可以加入这些表格,看看惠普设备是一个17英寸屏幕的笔记本电脑,佳能和Ikon设备都是摄像头,分别有650万像素和800万像素。
问题是,如果您一开始不知道设备的类型,那么如何确定设备的类型,而您只有GenericDevice表中的一行。让我们以第一行为例。你知道这款设备是由惠普公司生产的,是05年06年09年发货的,但你一开始并不知道它是什么类型的设备。但是,您可以通过搜索子表,直到找到带有deviceID = 1的行为止。膝上型计算机表包含这样的一行,因此惠普设备实际上必须是该笔记本电脑。但是,简单地发现设备类型似乎是不必要的麻烦(特别是如果您有20+子类,您必须搜索这些子类来查看deviceID匹配的位置)。相反,你可以这样做:
GenericDevice
deviceID brand shipDate deviceType
1 HP 05/06/09 laptop
2 Canon 11/16/08 camera
3 Ikon 02/27/09 camera现在您可以立即看到HP设备的类型。但是现在有了重复的数据(隐式的)。要了解原因,请考虑用户是否进行了此更改:
GenericDevice
deviceID brand shipDate deviceType
1 HP 05/06/09 camera
2 Canon 11/16/08 camera
3 Ikon 02/27/09 camera(第一行的deviceType已切换为摄像机)
现在,您有了相互矛盾的信息--上面的表格显示惠普设备是一台照相机,但是笔记本电脑表中有一排这样的设备。换句话说,您实际上是在两次存储HP设备的类型,一次在GenericDevice表中使用deviceType字段,一次只是因为笔记本表中有一行deviceID = 1。
发布于 2009-07-06 20:30:46
“但这似乎是不必要的连接量,找出一些如此简单的东西。”
你说对了。
我一直在你的鞋,我很幸运,我仍然有这个网站书签,以防我需要再次参考。它甚至包括关于如何设置您要寻找的约束的信息。
假设您使用的是Server,下面是:在Server中实现表继承
发布于 2009-07-06 18:45:35
只将类型存储在一个表中,父表或子表,只需选择一个。如果你把它放在两个地方,你就必须保持它们的同步,为什么不把所有的子信息都保存在父母身上呢?这使它更容易;-) (一个笑话,不要把所有的东西放在父表!)
编辑
我会在GenericDevice表中放置一个Type列,但我会将其作为代码或数字ID,并将FK设置为DeviceType表,而不是像“膝上型计算机”或“照相机”这样的词。还要确保品牌使用一个代码或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列):
SELECT
g.deviceID,g.shipDate
,l.screenSize
,c.megapixels
FROM GenericDevice g
LEFT OUTER JOIN Laptop l ON g.deviceID=l.deviceID
LEFT OUTER JOIN Camera c ON g.deviceID=c.deviceID
WHERE g.deviceID=1234发布于 2009-07-06 18:43:57
我将在父表中维护一个deviceType列,因为您可能有几个设备类型映射到同一个子表。
我会在任何子表中维护一个deviceType的副本,这些子表实际上需要它来加快查询速度。我不认为仅仅为了获得deviceType就加入父级就会使事情慢下来。另外,您可能会使用父表中的许多列,在这种情况下,再多一个列不会对任何事情造成伤害。
重复将由插入和更新的触发器来维护。
您提到了更新deviceType导致数据完整性问题的问题。答案是,“别那么做”。如果设备类型不能更改,那么更新触发器就不应该允许更改。
https://stackoverflow.com/questions/1088600
复制相似问题