Database design 使用引用FK的PK处理数据库中项目的特定于类别的属性

Database design 使用引用FK的PK处理数据库中项目的特定于类别的属性,database-design,model,foreign-keys,primary-key,Database Design,Model,Foreign Keys,Primary Key,假设所有Item都有一组共同的属性,如ItemName和itemage 进一步假设您事先知道,项(它们可能重叠)有一些特定的区别,需要特定的列。例如,ToyItem有一个特殊的列MinimumAge,CarItem有一个特殊的列NumWheels 我希望在数据库中按如下方式处理此问题:使用主键创建Item表ItemId。创建ToyItem表,其主键引用Item中的ItemId。创建一个CarItem表,其主键也引用Item中的ItemId 因此,我的问题是: 使用单个外键作为子项表的主键是否合理

假设所有
Item
都有一组共同的属性,如
ItemName
itemage

进一步假设您事先知道,
(它们可能重叠)有一些特定的区别,需要特定的列。例如,
ToyItem
有一个特殊的列
MinimumAge
CarItem
有一个特殊的列
NumWheels

我希望在数据库中按如下方式处理此问题:使用主键创建
Item
ItemId
。创建
ToyItem
表,其主键引用
Item
中的
ItemId
。创建一个
CarItem
表,其主键也引用
Item
中的
ItemId

因此,我的问题是:

  • 使用单个外键作为子项表的主键是否合理
  • 是否有另一种设计方法可以跟踪所有不同类型的
    项目
    ?现在我必须提前知道这些是什么

  • 这取决于你的需要。特别是关于您计划如何查找数据。 如果您想从
    Item
    表中通过属性查找任何类型的项,那么您的布局也不是太不合理。我仍然会建议一种不同的策略,这种策略也很容易扩展:

    保留您的
    表,只添加一个名为
    Attr的表。在
    Attr
    中,您可以有两个数据字段,
    name
    value
    以及
    项的外键。如果需要,您还可以将
    Attr.name
    设置为
    enum
    类型,以便只能将允许的属性添加到
    项中的主“对象”

    另一种方法是为每个子类型(如
    玩具
    汽车
    )创建表格,并将这些表格引用到
    项目
    (而不是反过来)


    在任何情况下,您都可以
    轻松地加入这些表,因此这实际上取决于您。

    听起来玩具项目和汽车项目都是类项目的子类。见下文


    那么您要走哪条路呢?我将坚持每个子类一个表的方法,因为子类不会太多。如果我采用您建议的第一种方法,那么从方案来看,子类的“特殊性”是不清楚的。。。如果这是有道理的话……谢谢,听起来他们描述了相同的“共享主键”方法,所以我感觉好多了