代码之家  ›  专栏  ›  技术社区  ›  JoeCool

在超类表中发现行的子类

  •  2
  • JoeCool  · 技术社区  · 17 年前

    我有一个电子设备表,作为一个通用的超类,然后为电话、笔记本电脑、相机等分开子类表,扩展超类并提供设备上的特定信息(使用超类表中的外键设备ID),换句话说, Class Table Inheritance . 我的问题是,我应该在超类中有一个“deviceType”列吗?这是多余的,因为你 能够 通过查看特定deviceid出现在哪个子类表中来发现设备类型,但这似乎是为了找到如此简单的内容而进行的不必要的连接量。

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

    另一个问题是约束…如何约束它,使设备仅为子类型一次?如中所述,如何阻止将与相机表中已存在的行具有相同设备ID的行添加到笔记本电脑表中?同样,对于一个好的用户界面,这是不可能实现的,但是数据库约束总是更好的选择。

    谢谢!

    另外,如果我们使用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英寸屏幕的笔记本电脑,而Canon和Ikon设备都是分别具有6.5和8百万像素的摄像头。

    问题是,如果您首先不知道设备是什么类型的,那么您所拥有的只是genericdevice表中的一行。让我们以第一行为例。你知道这台设备是由惠普公司生产的,于2009年5月6日发货,但你最初并不知道它是什么类型的设备。但是,您可以通过搜索子表,直到找到deviceid=1的行来解决这个问题。笔记本电脑桌上有这样一行,所以惠普设备实际上必须是那台笔记本电脑。但是,这似乎是发现设备类型的不必要的麻烦(特别是如果您有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已切换到camera)
    现在,您有了相互冲突的信息-上表显示HP设备是一个摄像头,但在笔记本电脑表中有一行用于该设备。 换句话说,您有效地将HP设备类型存储了两次。 一次使用genericdevice表中的deviceType字段,一次简单地通过这样一个事实:在deviceid=1的膝上型电脑表中有一行。

    3 回复  |  直到 17 年前
    推荐文章