目前,我正在研究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
CASCADE
和On DELETE
Restrict
。
这就是我觉得我应该做的事情,我不确定它是否正确。但是,我想更好地了解它。
说我想创建一对一,然后看起来像On UPDATE
Restrict
和On DELETE
Restrict
,这是正确的吗?
抱歉,我在这里完全感到困惑,我无法找到分解关系模型的不同设置的教程,博客或解释。任何人都可以根据我在这里的内容帮助解释这些类型以及其他类型(多对多,多对一)吗?
答案 0 :(得分:4)
一个角色可以有许多与该角色关联的用户。此整个关系在物理上用USERS表上的foreign key
表示,该表引用了ROLES表。
外键约束中的ON UPDATE
和ON 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。