Database 数据库:类和其中一个子类之间的外键。是否使用单个FK列?

Database 数据库:类和其中一个子类之间的外键。是否使用单个FK列?,database,database-design,foreign-keys,Database,Database Design,Foreign Keys,我正在修改和扩展一个现有的数据模型,其中一个部分包含个人数据。当前的person表只是一个包含所有字段的大表,包括自然人和法人的字段,而非相关字段仍然为空。 随着我们添加越来越多的字段,我们的想法是要有一个单人表和两个子类NATURALPERSON和LEGALPERSON,其中一个人不可能同时拥有这两个子类 听起来很简单,但开始阅读并怀疑我最初的方法。你会怎么做 我想到的第一个选择是在PERSON表中为外键LEGAL_NATURAL设置一列,它将是指向LEGALPERSON或NATURALPER

我正在修改和扩展一个现有的数据模型,其中一个部分包含个人数据。当前的person表只是一个包含所有字段的大表,包括自然人和法人的字段,而非相关字段仍然为空。 随着我们添加越来越多的字段,我们的想法是要有一个单人表和两个子类NATURALPERSON和LEGALPERSON,其中一个人不可能同时拥有这两个子类

听起来很简单,但开始阅读并怀疑我最初的方法。你会怎么做

  • 我想到的第一个选择是在PERSON表中为外键LEGAL_NATURAL设置一列,它将是指向LEGALPERSON或NATURALPERSON的指针。为了确保相互排斥,子类的记录ID可以使用单个序列构造
  • 替代2个FK的1列,另一种方法是在PERSON表中有2列(例如NATURALPERSON、LEGALPERSON),每个列都有一个指向子类的指针。然后,一个约束可以确保两者不会同时被填充。可能会使FK关系更加明显

  • 不同的方法是让子类指向PERSON表。其缺点是,在PERSON表中,无论是自然人记录还是法人记录都不可见,但总体而言,这可能是一个更好的设计

  • 在上找到有关独占弧的一些信息


    这里有明确的赢家吗?

    三张桌子的设计看起来不错

    就PKs和FKs而言,我推荐一种称为共享主键的技术

    person表有一个ID字段,用作主键。
    自然人和法人表没有独立的ID字段。相反,这两个子类都使用PersonID作为它们自己表中的PK。PersonID也是引用person表中ID的FK


    这使连接变得简单、容易和快速。

    有趣的方法,我没有考虑过这个选项。这也将使数据迁移更容易。
    SELECT * 
    FROM PRSN pr 
        left join LEGALPERSON_DETAIL lp on pr.legal_natural = lp.id
        left join NATURALPERSON_DETAIL np on pr.legal_natural = np.id;