gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:34:17 24 4
gpt4 key购买 nike

设置

所以这里有一个场景,一旦你决定使用 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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com