代码之家  ›  专栏  ›  技术社区  ›  Kirk Broadhurst

使用或不使用外键约束对记录分组

  •  1
  • Kirk Broadhurst  · 技术社区  · 16 年前

    我有一个包含对象的表,类似于:

    PK ObjectId
    FK ObjectTypeId
    Description
    etc
    

    需要对对象进行分组。我得到了很多建议,这些建议都是“工作”的,有些我比其他人更喜欢。它们都不是完美的,所以我正在努力适应任何特定的模式。

    1/添加自引用外键 .这是干净但不理想的,因为(a)没有逻辑父对象(它是一个组,而不是层次结构),以及(b)Linq to SQL遍历自引用层次结构可能会带来麻烦-需要检查当前对象是“父对象”还是“子对象”等。

    PK ObjectId
    FK ParentObjectId
    

    2/添加父表和外键 . 这会添加约束,但组表不包含任何有用的信息-它的存在只是为了提供groupid约束和标识。

    Table Object
    PK ObjectId
    FK GroupId
    
    Table Group
    PK GroupId
    

    3/添加没有约束或外键的groupid .没有数据完整性。理论上,当插入一个新的对象组时,每个对象都被赋予groupid=第一个分配的objectid。可能是最简单和最实用的解决方案。

    例如

    ObjectId  GroupId
    ...
    15         10
    16         16
    17         16
    ...
    21         16
    22         22
    

    我的问题是,在理论和/或实践中,哪一个是最好的,以及为什么。或者,请告诉我一个更好的方法!我个人喜欢(2),因为它是规范化的,但是被告知只有一个字段的表是糟糕的设计。想法和建议?

    2 回复  |  直到 9 年前
        1
  •  1
  •   KM.    16 年前

    从您提供的有限信息来看,很难推荐一个选项,因为该方法取决于您对表的使用。存储数据是一回事,但是使用它是一个完全不同的问题。所有这三个存储数据是一种检索数据的方法,但是您需要构造什么查询来加载、聚合和搜索数据?

    我将实现每个方法,用一小部分数据填充,并尝试像应用程序那样编写一些查询来收集数据。任何问题或困难,在使用表设计将变得明显。

    您应该总是设计您的表,以便数据检索快速和容易。你不应该为了把你的数据拿出来而和你的桌子打架。如果您发现自己在与表作斗争以获取数据,那么您设计得很糟糕。你的桌子结构应该让你的生活更容易而不是更困难。

        2
  •  2
  •   Adriaan Stander    16 年前

    对于选项2,您始终可以为多个分组级别添加附加字段,用于描述、显示顺序和GroupParentID。此外,您还可以在这些分组结构上实现安全性。

    在我们的应用程序中,我们使用这个结构。