Sql 多对多关系中的一对一
我想为具有多个角色的用户分配一个主角色,我想知道哪种方法更可取(如果有的话)。要在用户表中创建一个Sql 多对多关系中的一对一,sql,relational-database,relationship,Sql,Relational Database,Relationship,我想为具有多个角色的用户分配一个主角色,我想知道哪种方法更可取(如果有的话)。要在用户表中创建一个primary\u role\u id列,或在透视表中添加一个is\u primary列,请执行以下操作: 用户: 身份证件 名称 这里的主要角色id? 1. 爱丽丝 2. 2. 上下快速移动 1. 要求 这很简单,但不是那么简单。你真正想要的是: 每个用户都可以担任1对n角色 在这一组中,一个RoleUser是主要的 因此: IsPrimary指示器必须位于RoleUser 您需要对
primary\u role\u id
列,或在透视表中添加一个is\u primary
列,请执行以下操作:
用户:
身份证件
名称
这里的主要角色id?
1.
爱丽丝
2.
2.
上下快速移动
1.
要求
这很简单,但不是那么简单。你真正想要的是:
- 每个
都可以担任1对n用户
角色
- 在这一组中,一个
是主要的RoleUser
- 在这一组中,一个
指示器必须位于IsPrimary
RoleUser
- 您需要对调用函数的
角色设置
检查
约束,以确保每个
用户只有一个
IsPrimary
角色
- 这是标准SQL中的普通功能,在真正的SQL平台中可用,在免费软件中不可能
- 每个
都可以担任1对n用户
角色
- 每个
有一个主要用户
角色
- 这导致了维护的复杂性:集合位于一个位置,集合的指示器位于另一个位置。所需功能检查
在用户
中是否具有声明为RoleUser
的PrimaryRoleId
角色
- 这是低劣和错误的
- 因此,“用户具有一对一的PrimaryRole”是真的,但不是声明性的。
- 这导致了维护的复杂性:集合位于一个位置,集合的指示器位于另一个位置。所需功能检查
users
表上的一列,而不是role\u user
上的一列。users
表上还应该有一个FK torole\u user
表(id,primary\u role\u id)。然而,许多真实的数据库不允许这种关系(Oracle和PostgreSQL是显著的例外,值得称赞)。谢谢@TheImpaler!快速提问,看起来您使用SQL的经验非常丰富。你能推荐一本关于sql数据库设计的好书吗?@theimpler。在关系模型中禁止循环引用。根据定义,允许它的免费软件套件是反关系的。@PerformanceDBA“在关系模型中禁止循环引用”——这句话很有趣!你能给我指一下有关它的文件吗?我同意,关系代数并不促进它们。但是,SQL标准允许它包含约束管理的所有规定。对我来说,它们对于保持数据质量非常有用。@TheImpler§1.4标准格式(1)。树=有向无环图=无循环引用。人们喜欢与否并不重要,重要的是它是否正确。SQL标准现在允许这样做,因为他们屈服于来自“学者”的政治压力。SQL允许许多反关系概念。