连接表上的 SQL 约束

Ben*_*ith 5 sql postgresql

我的 PostgreSQL 数据库中有四个表:

  • Company
  • User(带有外键列company_id)
  • Location(带有外键列company_id)
  • UserLocations(关联表,具有外键列 user_id 和 location_id)

本质上:

  • 一家公司有许多用户和地点
  • 一个用户属于一个公司并且有多个位置
  • 一个位置属于一家公司并拥有许多用户

我想知道数据库是否有办法限制 UserLocations 关联表中的条目,以便引用的用户和位置必须具有相同的 company_id 值。我不希望 A 公司的用户拥有 B 公司的位置。

我可以在我的应用程序层(rails)检查这一点,但如果存在该选项,我有兴趣使其成为硬数据库级约束。

Gor*_*off 4

实现此目的的一种方法是使用外键引用和冗余。

因此,该UserLocations表将有UserIdLocationId、 和CompanyId。然后它将具有以下外键关系:

foreign key (UserId, CompanyId) references Users(UserId, CompanyId)
foreign key (LocationId, CompanyId) references Locations(LocationId, CompanyId)
Run Code Online (Sandbox Code Playgroud)

当然,您必须声明Users(UserId, CompanyId)Locations(LocationId, CompanyId)作为唯一键以供参考。这有点多余,但它确实保证了与公司的匹配,而无需创建触发器。