首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在超类表中发现行的子类

在超类表中发现行的子类
EN

Stack Overflow用户
提问于 2009-07-06 18:41:51
回答 3查看 776关注 0票数 2

我有一个电子设备表,作为一个通用超类,然后为电话、膝上型计算机、照相机等单独的子类表扩展超类,并提供设备上的特定信息(使用超类表中的外键deviceID ),换句话说,就是类表继承。我的问题是,我应该在超类中有一个"deviceType“列吗?这将是多余的,因为您可以通过查看特定deviceID出现在哪个子类表中来发现设备类型,但这似乎是不必要的连接量,可以找到这么简单的东西。

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

另一个问题是限制..。我如何限制它,使设备只被子类型一次?如图所示,如何阻止将行添加到与摄像机表中已经存在的行相同的deviceID的膝上型计算机表中?同样,如果有一个好的UI,这是不太可能的,但是数据库约束总是更好的。

谢谢!

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

增加以求澄清

首先是超类表:

GenericDevice

代码语言:javascript
复制
deviceID    brand     shipDate
   1        HP        05/06/09
   2        Canon     11/16/08
   3        Ikon      02/27/09

下面是两个示例子类:

笔记本电脑

代码语言:javascript
复制
laptopID    deviceID    screenSize
   1           1           17

相机

代码语言:javascript
复制
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

代码语言:javascript
复制
deviceID    brand     shipDate   deviceType
   1        HP        05/06/09      laptop
   2        Canon     11/16/08      camera
   3        Ikon      02/27/09      camera

现在您可以立即看到HP设备的类型。但是现在有了重复的数据(隐式的)。要了解原因,请考虑用户是否进行了此更改:

GenericDevice

代码语言:javascript
复制
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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-06 20:30:46

“但这似乎是不必要的连接量,找出一些如此简单的东西。”

你说对了。

我一直在你的鞋,我很幸运,我仍然有这个网站书签,以防我需要再次参考。它甚至包括关于如何设置您要寻找的约束的信息。

假设您使用的是Server,下面是:在Server中实现表继承

票数 1
EN

Stack Overflow用户

发布于 2009-07-06 18:45:35

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

编辑

我会在GenericDevice表中放置一个Type列,但我会将其作为代码或数字ID,并将FK设置为DeviceType表,而不是像“膝上型计算机”或“照相机”这样的词。还要确保品牌使用一个代码或ID和一个FK到一个品牌表。

代码语言:javascript
复制
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列):

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2009-07-06 18:43:57

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

我会在任何子表中维护一个deviceType的副本,这些子表实际上需要它来加快查询速度。我不认为仅仅为了获得deviceType就加入父级就会使事情慢下来。另外,您可能会使用父表中的许多列,在这种情况下,再多一个列不会对任何事情造成伤害。

重复将由插入和更新的触发器来维护。

您提到了更新deviceType导致数据完整性问题的问题。答案是,“别那么做”。如果设备类型不能更改,那么更新触发器就不应该允许更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1088600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档