创建MySQL表问题是,为什么有些人创建两个相互关联的表而不是一个?
我对在MySQL中创建表感到非常困惑,因为我阅读了一些PHP教程,作者在他们的数据库中创建了两个表,然后稍后在PHP中使用联接将它们链接起来 这是我从一篇文章中得到的一个例子 在这里,作者创建了表用户和组创建MySQL表问题是,为什么有些人创建两个相互关联的表而不是一个?,mysql,database,Mysql,Database,我对在MySQL中创建表感到非常困惑,因为我阅读了一些PHP教程,作者在他们的数据库中创建了两个表,然后稍后在PHP中使用联接将它们链接起来 这是我从一篇文章中得到的一个例子 在这里,作者创建了表用户和组 CREATE TABLE users ( id int(8) NOT NULL auto_increment, name varchar(255) NOT NULL default '', pass varchar(255) NOT NULL
CREATE TABLE users (
id int(8) NOT NULL auto_increment,
name varchar(255) NOT NULL default '',
pass varchar(255) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=InnoDB;
CREATE TABLE groups (
uid int(8) NOT NULL default '0',
grp varchar(255) NOT NULL default ''
) TYPE=InnoDB;
当我看到它时,分组表不是没有必要吗?我的意思是我可以这样创建表:
CREATE TABLE users (
id int(8) NOT NULL auto_increment,
name varchar(255) NOT NULL default '',
pass varchar(255) NOT NULL default '',
grp varchar(255) NOT NULL default ''
PRIMARY KEY (id)
) TYPE=InnoDB;
这样,我就可以查询数据库,根本不需要将两个表连接在一起
那么,创建两个表而不是一个表的目的是什么?请向我解释为什么将两个表链接在一起比一个好。I许多身份验证系统一个用户可以有多个组。因此,需要两个表格。如果你想知道如何设计你的桌子,你可以阅读一下 如果您为组创建一个表,为用户创建一个表,并为组中的用户创建一个表,则效果会更好。这是因为在一个组中有多个用户是很常见的,并且用户可以有多个组(多对多关系)。关系数据库中的多对多关系是不可能的。因此,您需要额外的桌子。
此系统的另一个优点是,如果您决定更改组名,则无需更改每个用户的名称。您只需更改名称一次,所有用户都可以更改名称 你会得到这样的东西
- table user
- id
- username
- password
- etc
- table groups
- id
- name
- etc
- table usergroups
- userid
- groupid
您还可以看看FCO-IM,它是一种比ERM更复杂的数据库设计方法,但对于更大、更复杂的数据库可能更方便。在您的示例中(只有一个表),用户和组之间只能有一对一的关系。(即:给定用户最多只能属于一个组)
但是,如果将用户和组分开,则可以轻松地建立更广泛的关系集(一对一、一对多等),例如允许单个用户属于多个组等,同时仍然可以轻松查找给定组的组成员资格。也就是说,您需要第三个“用户到组成员”表,该表将包含给定用户所属的每个组的条目。这是一种奇怪的方式。通常,您需要一个包含用户信息(化身、信息等)的用户表和一个groupId,groupId是对groups表中存在的组的引用。使用此概念,您可以拥有一个组表,其中每个组都有自己的信息,例如化身、描述和/或组所有者。它基本上减少了重复并允许您扩展关系。关键字是“” 你只有一张桌子。因为你的懒惰或疲劳,你决定在一周后输入“mod”而不是“版主”。。。不好 如果使用两个(或三个)表,则只需选择/键入ID,并且可以轻松地将一个用户应用于多个组
CREATE TABLE users (
user_id int(8) NOT NULL auto_increment,
name varchar(255) NOT NULL default '',
pass varchar(255) NOT NULL default '',
PRIMARY KEY (user_id)
) TYPE=InnoDB;
CREATE TABLE groups (
group_id int(8) NOT NULL auto_increment,
name varchar(255) NOT NULL default '',
PRIMARY KEY (group_id)
) TYPE=InnoDB;
CREATE TABLE user_groups (
user_id INT(8) NOT NULL ,
group_id INT(8) NOT NULL ,
PRIMARY KEY (user_id, group_id) ,
INDEX user_id (user_id ASC) ,
INDEX group_id (group_id ASC) ,
CONSTRAINT user_id FOREIGN KEY (user_id ) REFERENCES users (user_id ) ON DELETE CASCADE,
CONSTRAINT group_id FOREIGN KEY (group_id ) REFERENCES groups (group_id ) ON DELETE CASCADE
)
ENGINE = InnoDB;
思考…思考..在网上搜索规范化..你应该能够自己找到答案。如果你只创建一个表,那么每个用户仅限于一个组(或者你必须跳转才能将一个用户分配到多个组)。现实世界的场景远比这复杂,有时,您不会创建额外的表,但并非总是这样!