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 to
role\u user
表(id,primary\u role\u id)。然而,许多真实的数据库不允许这种关系(Oracle和PostgreSQL是显著的例外,值得称赞)。谢谢@TheImpaler!快速提问,看起来您使用SQL的经验非常丰富。你能推荐一本关于sql数据库设计的好书吗?@theimpler。在关系模型中禁止循环引用。根据定义,允许它的免费软件套件是反关系的。@PerformanceDBA“在关系模型中禁止循环引用”——这句话很有趣!你能给我指一下有关它的文件吗?我同意,关系代数并不促进它们。但是,SQL标准允许它包含约束管理的所有规定。对我来说,它们对于保持数据质量非常有用。@TheImpler§1.4标准格式(1)。树=有向无环图=无循环引用。人们喜欢与否并不重要,重要的是它是否正确。SQL标准现在允许这样做,因为他们屈服于来自“学者”的政治压力。SQL允许许多反关系概念。