通过 SQL Server 与 FK 实施两个 M2M 关系

问题描述 投票:0回答:1

我有以下实体


**Account**
Id
Name


**User**
Id
Name

用户可以属于多个帐户。

**AccountUser**
Id
Account_Id FK
User_Id Fk

帐户可以有多个用户组。

**AccountUserGroup**
Id
Account_Id FK
Name

用户可以是帐户用户组的成员。

**AccountUserGroupMembership**
Id
User_Id FK
AccountUserGroup FK

如何强制只将属于 AccountUserGroup 的用户添加到那些没有业务逻辑的帐户的 AccountUserGroupMembership 中。这在 SQL Server 中可能吗?

例如

用户 1 属于账户 100。 帐户 200 有一个 AccountUserGroup,ID 1000。 用户 ID 1 AccountUserGroupId 200 的 AccountUserGroupMembership 将无效。

谢谢你

到目前为止我所有的表都有 FK 约束

AccountUser - AccId 和 UserId 帐户用户组 - AccId AccountUserGroupMembership - AccUserGroupId 和 AccountUserId

sql sql-server foreign-keys
1个回答
0
投票

首先,多对多连接表通常不需要单独的 ID 列。主键应该只是两个外键的组合。

回答你的问题:你需要使

AccountUserGroupMembership
有一个针对
AccountUserGroup
的外键,而不是针对
User
Account
。而
AccountUserGroup
本身需要有一个包含
AccountId
的密钥(可以是辅助唯一密钥),这样它才能通过。

AccountUser (
  User_Id int NOT NULL REFERENCES [User] (Id),
  Account_Id int NOT NULL REFERENCES Account (Id),
  PRIMARY KEY (User_Id, Account_Id)
)

AccountUserGroup (
  Id int NOT NULL IDENTITY PRIMARY KEY,
  Account_Id int NOT NULL REFERENCES Account (Id),
  Name varchar(50) NOT NULL UNIQUE,
  UNIQUE (Account_Id, Id)
)

AccountUserGroupMembership (
  AccountUserGroup_Id int NOT NULL,
  Account_Id int NOT NULL,
  User_Id int NOT NULL REFERENCES [User] (Id),
  PRIMARY KEY (Account_Id, AccountUserGroup_Id, User_Id),
  FOREIGN KEY (AccountUserGroup_Id, Account_Id) REFERENCES AccountUserGroup (Account_Id, Id)
)

这意味着您只能在

AccountUserGroupMembership
表中存在一对
AccountUserGroup_Id, Account_Id
的位置插入
AccountUserGroup
行。

© www.soinside.com 2019 - 2024. All rights reserved.