Создание таблиц MySQL. Вопрос: почему некоторые люди создают две таблицы, которые относятся друг к другу, а не одну? - PullRequest
2 голосов
/ 04 января 2011

Я очень запутался в создании таблиц в 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 ]

3 голосов
/ 04 января 2011

ключевое слово ' нормализация '

у вас есть только одна таблица.и потому что ваш ленивый или уставший вы решаете через неделю набирать 'mod' вместо 'moderator' ... нехорошо

, если вы используете две (или три) таблицы, вам нужно только выбрать / напечатать в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;
3 голосов
/ 04 января 2011

У меня много систем аутентификации, 1 пользователь может иметь несколько групп. Поэтому необходимо 2 таблицы. Если вы хотите иметь хорошее представление о том, как создавать таблицы, вы можете прочитать нормализация базы данных .

даже лучше, если вы создадите таблицу для групп, таблицу для пользователей и таблицу для пользователей в группах. Это связано с тем, что в группе обычно несколько пользователей, а у пользователей может быть несколько групп (отношение многие ко многим). Отношения ко многим в реляционных базах данных невозможны. Для этого вам понадобится дополнительный стол.
Другое преимущество этой системы заключается в том, что если вы решите изменить имя группы, вам не нужно менять это имя для каждого пользователя. Вы можете просто изменить имя один раз, и оно будет изменено для всех пользователей.

Вы получаете что-то вроде этого.

- table user
  - id
  - username
  - password
  - etc

- table groups
  - id
  - name
  - etc

- table usergroups
  - userid
  - groupid

Вы также можете взглянуть на FCO-IM, который является более сложным методом проектирования баз данных по сравнению с ERM, но может быть полезен для больших и более сложных баз данных.

0 голосов
/ 04 января 2011

Это странный способ сделать это. Обычно вам нужна таблица пользователей с информацией о пользователях (аватаром, информацией и т. Д.) И groupId, который является ссылкой на группу, существующую в таблице групп. Использование этой концепции позволяет вам иметь таблицу групп, где каждая группа имеет свою собственную информацию, такую ​​как аватар, описание и / или владелец группы. Это в основном уменьшает дублирование и позволяет расширять отношения.

0 голосов
/ 04 января 2011

В вашем примере (где есть только одна таблица) вы можете иметь только однозначное отношение между пользователем и группой. (т. е. данный пользователь может принадлежать не более одной группе).

Однако, если вы разделите пользователей и группы, вы можете легко получить гораздо более обширный набор отношений (один к одному, один ко многим и т. Д.), Например, позволить одному пользователю принадлежать нескольким группам и т. Д. все еще будучи в состоянии тривиально искать членство в группе для данной группы. Тем не менее, вам понадобится третья таблица «членство пользователя в группе», которая будет содержать запись для каждой группы, членом которой является данный пользователь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...