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

时间:2011-01-04 13:06:42

标签: 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 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;

通过这种方式,我可以只查询数据库,而且根本不需要将两个表连接在一起。

那么创建两个表而不是一个表的目的是什么?请向我解释为什么将两个表连接在一起比一个表好。

4 个答案:

答案 0 :(得分:3)

我很多身份验证系统1用户可以拥有多个群组。因此需要2个表。如果您想知道如何设计表格,那么可以阅读database normalization

如果你为组创建一个表,为用户创建一个表,为组中的用户创建一个表,那么甚至更好。这是因为组中有多个用户并且用户可以拥有多个组(多对多关系)是很常见的。关系数据库中的多对多关系是不可能的。因此你需要额外的桌子 此系统的另一个优点是,如果您决定更改组名,则不需要为每个用户更改该名称。您只需更改一次名称,即可为所有用户更改名称。

你得到这样的东西。

- table user
  - id
  - username
  - password
  - etc

- table groups
  - id
  - name
  - etc

- table usergroups
  - userid
  - groupid

您还可以查看FCO-IM,与ERM相比,这是设计数据库的一种更复杂的方法,但对于更大,更复杂的数据库可能更方便。

答案 1 :(得分:3)

关键字为“normalization

你只有一张桌子。并且因为你懒惰或累了,你决定在一周后输入'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;

答案 2 :(得分:0)

在您的示例中(只有一个表),您只能在用户和组之间建立一对一的关系。 (即:给定用户最多只能属于一个组。)

但是,如果您将用户和群组分开,则可以轻松地拥有更广泛的关系(一对一,一对多等),例如允许单个用户属于多个群组等,同时仍能够轻松查找给定组的组成员身份。也就是说,您将需要第三个“用户到组成员资格”表,其中包含给定用户所属的每个组的条目。

答案 3 :(得分:0)

这是一种奇怪的方式。通常,您希望用户表具有用户信息(头像,信息等)和groupId,它是对组表中存在的组的引用。使用此概念,您可以拥有一个组表,其中每个组都有自己的信息,例如头像,描述和/或组合所有者。它基本上减少了重复,并允许您扩展关系。