繁体   English   中英

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

[英]Creating MySQL tables question, why some people create two tables that relate to each other instead of one?

我在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;

这样,我可以查询数据库,而根本不需要将两个表连接在一起。

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

我很多身份验证系统1个用户可以有多个组。 因此,需要2个表。 如果您想了解如何设计表,那么可以阅读数据库规范化

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

你得到这样的东西。

- table user
  - id
  - username
  - password
  - etc

- table groups
  - id
  - name
  - etc

- table usergroups
  - userid
  - groupid

您也可以看一下FCO-IM,它是一种比ERM更为复杂的数据库设计方法,但对于更大,更复杂的数据库可能会派上用场。

关键字是“ 规范化

您只有一张桌子。 而且由于您懒惰或累了,您决定在一周后键入“ 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;

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM