Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建MySQL表问题是,为什么有些人创建两个相互关联的表而不是一个?_Mysql_Database - Fatal编程技术网

创建MySQL表问题是,为什么有些人创建两个相互关联的表而不是一个?

创建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

我对在MySQL中创建表感到非常困惑,因为我阅读了一些PHP教程,作者在他们的数据库中创建了两个表,然后稍后在PHP中使用联接将它们链接起来

这是我从一篇文章中得到的一个例子

在这里,作者创建了表用户和组

    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;

思考…思考..在网上搜索规范化..你应该能够自己找到答案。如果你只创建一个表,那么每个用户仅限于一个组(或者你必须跳转才能将一个用户分配到多个组)。现实世界的场景远比这复杂,有时,您不会创建额外的表,但并非总是这样!