Database 用于从多个可能的外部表中选择一个的DB设计

Database 用于从多个可能的外部表中选择一个的DB设计,database,database-design,schema,Database,Database Design,Schema,假设我有两个或多个截然不同的对象,每个对象都由数据库中的一个表表示。称这些为文章、书籍等等。现在假设我想为每个对象添加注释功能。注释在每个对象中的行为完全相同,因此理想情况下,我希望在一个表中表示它们 然而,我不知道一个好方法来做到这一点。我知道如何做到这一点的方法有: 为每个对象创建注释表。还有文章评论、书籍评论等等。每个对象都有一个外键列指向相应的对象 创建一个全局注释表。具有引用“书”或“文章”的注释类型。每个对象都有一个可为null的外键列,并使用comment_类型确定要使用的外键

假设我有两个或多个截然不同的对象,每个对象都由数据库中的一个表表示。称这些为文章、书籍等等。现在假设我想为每个对象添加注释功能。注释在每个对象中的行为完全相同,因此理想情况下,我希望在一个表中表示它们

然而,我不知道一个好方法来做到这一点。我知道如何做到这一点的方法有:

  • 为每个对象创建注释表。还有文章评论、书籍评论等等。每个对象都有一个外键列指向相应的对象
  • 创建一个全局注释表。具有引用“书”或“文章”的注释类型。每个对象都有一个可为null的外键列,并使用comment_类型确定要使用的外键

上述任何一种方法都需要在每次添加新对象时更新模型/db。有更好的方法吗?

我个人认为您的第一个选项是最好的,但我会将此选项用于样式点:

评论有一个自然的结构。你有第一条评论,也许是关于评论的评论。这真是一棵评论树

如果向指向注释树根的每个对象添加一个字段,会怎么样。然后您可以说,“检索第123条的注释树”,然后您可以获取根,然后基于一个注释表构建树


注意:我仍然最喜欢选项1

还有一种策略:从一个公共表继承不同类型的“可注释”对象,然后将注释连接到该表:

这三种策略都是有效的,各有利弊:

  • 单独的注释表是干净的,但需要在DML和可能的客户端代码中重复。此外,除非采用某种形式的继承,否则不可能在它们上强制使用公共密钥,这就引出了一个问题:为什么不直接使用(3)呢
  • 一个具有多个FK的注释表将具有大量空值(这可能是存储和缓存方面的问题,也可能不是),并且每当向数据库添加新类型的“可注释”对象时,都需要向注释表添加新列。顺便说一句,您不一定需要
    注释\u类型
    ——它可以从非空字段推断出来
  • 当前的关系型DBMS不直接支持继承,因为它带来了自己的一组数据。另一方面,它可以在不改变模型其余部分的情况下轻松添加新类型的可注释对象


  • 1又名。类别、子类化、泛化层次结构。。。有关继承的更多信息,请参阅中的“子类型关系”部分。

    第三种方法非常好。。。但是如何实现它呢?是否有任何ORM本机支持此功能?在实践中,它本质上是第一个选项吗?@tomo.otsuka请按照链接获取关于继承实现的一些提示-有3个主要变体(每个变体都有自己的优缺点)。我不确定ORM是否支持。