3

目前,我正在开发 MySQL InnoDB 中的用户数据库。所以,我将用它来帮助演示。

    Users                       Roles
  ---------------              ---------------
  userid (bigint) PK          >roleid (tinyint) PK
  email  (varchar)             rolename (varchar)
  username (varchar)
  password (char)
 >roleid (tinyint) FK
  created (timestamp)

现在,我正在尝试基于 roleid 在角色和用户之间创建一对多的关系。为此,我在想On UPDATE CASCADEOn DELETE Restrict

这就是我觉得我应该做的,我不确定它是否正确。但是,我想更好地了解它。

假设我想创建一对一,那么看起来像On UPDATE Restrictand On DELETE Restrict,对吗?

抱歉,我在这里完全糊涂了,我找不到分解关系模型不同设置的教程、博客或解释。任何人都可以根据我在这里的内容来帮助解释这些类型以及其他类型(多对多、多对一)吗?

4

1 回答 1

4

一个角色可以有许多用户与该角色相关联。这整个关系在物理上用foreign key引用 ROLES 表的 USERS 表表示。

外键约束中的ON UPDATEandON DELETE选项有助于在数据库中强制执行“参照完整性”,但它们根本没有指定 USERS 和 ROLES 实体之间的关系。

如果我使用 ON DELETE RESTRICT 创建这个外键,当我尝试从 ROLES 表中删除一条记录时,该键在 USERS 表上正在使用,我会收到错误消息。这与存在的逻辑关系的类型无关——它只是一个约束

不能使用一个外键来建模多对多关系。从逻辑上讲,如果一个用户可以拥有许多角色,那么将角色 id 存储在 users 表中是没有意义的。

在这种情况下,您将在两者之间创建一个表,并将 userid 和 roleid 列放在此表上,外键分别将它们连接到用户和角色。

USERS         USERS_ROLES     ROLES
userid PK  -  userid FK    
              roleid FK   -   roleid PK        

这是关于外键约束的 MYSQL 手册页。这是一个很好的参考,并解释了每个选项的含义。

编辑:

这涉及到一对多和多对多的关系类型。您很少会在数据库中看到一对一的类型(在这种情况下,合并表是有意义的)。有时为了性能,你会使用它。在这些情况下,通常您的主键在两个表上应该是相同的:

USERS             USERS_EXTENDED_ATTRIBUTES
userid PK    -    userid PK FK

对于 1-1 关系,每个表上应仅存在 1 个用户 ID。

于 2012-06-21T02:32:06.503 回答