【问题标题】:Guarantee that multiple FK fields belongs to the same row in another table保证多个FK字段属于另一个表的同一行
【发布时间】:2016-02-25 14:09:36
【问题描述】:

在一个 SaS 项目(软件即服务)上,想象一下这个场景:

使用应用程序的客户的主表是tenant,主键是id列。

我有 3 个表格来管理租户的数据,还有一个特定的表格来管理职位空缺的功能:

PeriodUnityShift 所有具有 PK idFK tenant_id的人>.

我的表vacancy有3个外键

  • period_id - 对“期间”表的引用
  • unity_id - 对“Unity”表的引用
  • shift_id - 对“Shift”表的引用

现在的问题:

我需要保证所有这 3 个 FK 都引用了属于租户表上同一客户的 Period、Unity 和 Shift 表上的行。

我的解释清楚了吗?

也许我可以创建一个触发器来处理这些验证。我真的不知道 SGBD 是否已经有相关资源。

有关信息:我正在使用带有 Eloquent ORM 的 SQL Server。但是,如果真的存在解决方案,那么最好的解决方案就是在任何地方都可以工作。

【问题讨论】:

  • 在这种情况下,租户表的 id 列只有一个外键。如果租户表没有单个 id 列,则创建一个。
  • 您可以选择更改表结构还是必须在此处给出的表结构内工作?
  • vacancy 表扩展为customer_id,然后将periodunityshirt 这三个表更改为包含它们的旧ID 和customer_id 的复合PK并将三个表PK中的一个FK添加到vacancy的一部分PK中。
  • Shadow - 问题比这复杂一点。 HLGEM - 是的,我需要更改表结构。 Smutje - 我将其他答案标记为已接受,因为它更容易理解。但你是对的。
  • @RicardoVigattiCoelho 从技术上讲,我的回答是评论,因此就 Stackoverflow 而言是不可接受的,所以没关系! :-)

标签: sql sql-server eloquent foreign-key-relationship


【解决方案1】:

1) 确保您的 tenant_id 在表 PeriodUnityShift 上定义为 NOT NULL

2) 在该表上创建以下唯一键:

  • 期间(tenant_id, period_id)
  • Unity(tenant_id, unity_id)
  • Shift(tenant_id, shift_id)

3) 将表vacancy 的列tenant_id 定义为NOT NULL

4) 在表 vacancy 上定义以下 FK:

  • (tenant_id, period_id) 引用 Period(tenant_id, period_id)
  • (tenant_id, unity_id) 引用 Unity(tenant_id, unity_id)
  • (tenant_id, shift_id) 引用 Shift(tenant_id, shift_id)

这样可以保证每个链接的行都具有相同的tenant_id

【讨论】:

  • 太棒了。我做了一些测试,这正是我需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 2017-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多