sql - 外键可以有一个常量而不是一个字段名吗?将 FK 与 STI 子类相关联

标签 sql database-design foreign-keys sti

设置

所以这里有一个场景,一旦你决定使用 STI(单表继承),我发现它很常见。

您有一些具有各种子类型的基本类型。

  • 人 <(教师、学生、员工等)
  • 用户 <(成员(member)、管理员)
  • 成员(member)<(买家,卖家)
  • 车辆<(汽车、船、飞机)

  • 在数据库中有两种主要的建模方法:
  • 单表继承
  • 一个带有类型字段和一堆可为空字段的大表
  • 类表继承
  • 每种类型一张表,共享 PK(从 child 到 parent 的 FK)

  • 虽然 STI 有几个问题,但我确实喜欢它如何设法减少您必须进行的连接数量,以及 Rails 等框架中的一些支持,但我遇到了如何关联的问题特定于子类的表。

    例如:
  • 认证应仅引用教师
  • 个人资料应仅引用成员(member)用户
  • WingInformation 不应与汽车或船有关(除非您可能是 bat 侠)
  • 广告归卖方成员所有,而不是买方成员所有

  • 使用 CTI,这些关系是微不足道的 - 只需在相关表上设置一个外键即可:
    ALTER TABLE advertisements
     ADD FOREIGN KEY (seller_id) REFERENCES sellers (id)
    

    但是对于 STI,类似的事情不会捕获子类型限制。
    ALTER TABLE advertisements
      ADD FOREIGN KEY (seller_id) REFERENCES members (id)
    

    我想看到的是这样的:
    * Does not work in most (all?) databases *
    ALTER TABLE advertisements
      ADD FOREIGN KEY (seller_id, 'seller') REFERENCES members (id, type)
    

    我所能找到的只是一个肮脏的黑客,需要向相关表添加一个计算列:
    ALTER TABLE advertisements
      ADD seller_type VARCHAR(20) NOT NULL DEFAULT 'seller'
    ALTER TABLE advertisements
      FOREIGN KEY (seller_id, seller-type) REFERENCES members (id, type)
    

    这让我觉得很奇怪(更不用说不雅了)。

    真题

    是否有 RDBMS 允许我这样做?

    有没有理由为什么这甚至不可能?

    这是否只是除最微不足道的情况外不使用 STI 的另一个原因?

    最佳答案

    没有在外键声明中声明常量的标准方法。您必须命名列。

    但是您可以使用以下方法之一强制该列具有固定值:

  • 计算列
  • 检查约束
  • 在 INSERT/UPDATE 之前触发以使用默认值覆盖任何用户提供的值。
  • 关于sql - 外键可以有一个常量而不是一个字段名吗?将 FK 与 STI 子类相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13551547/

    相关文章:

    sql - Oracle Sql : How can I output a table from procedure

    sql - mysql更快的匹配内部字符串的方法

    ruby-on-rails - 如何在 Rails 中为不同的用户建模

    mysql - 无法在mysql中创建带有外键的表

    SQL:按计数 (*) 分组作为总表行数的百分比

    mysql - 基于事件将三张表的数据汇集到一张表中

    mongodb - 从多个社交网络(Facebook 和 Linkedin...)获取统一配置文件的数据库方案

    database - 存储大量写入和高聚合的时间序列数据的最佳方式。 (约 10 亿点)

    MySQL 错误 1215 : Cannot add foreign key constraint

    c# - 自行创建的依赖关系(外键约束)