有人可以帮我理解外键UPDATE和DELETE vs关系名称吗?

时间:2012-06-21 02:17:53

标签: mysql sql foreign-keys relational-database

目前,我正在研究MySQL InnoDB中用户数据库的最初阶段。所以,我会用它来帮助演示。

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

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

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

说我想创建一对一,然后看起来像On UPDATE RestrictOn DELETE Restrict,这是正确的吗?

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

1 个答案:

答案 0 :(得分:4)

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

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

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

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

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

USERS         USERS_ROLES     ROLES
userid PK  -  userid FK    
              roleid FK   -   roleid PK        
关于外键约束的

Here's the MYSQL manual pages。这是一个很好的参考,并解释了每个选项的含义。

编辑:

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

USERS             USERS_EXTENDED_ATTRIBUTES
userid PK    -    userid PK FK

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