Таблицы базы данных - достаточно нормализовано? - PullRequest
2 голосов
/ 28 июня 2011

Вот две таблицы, которые я разработал для управления учетными записями пользователей.

create table if not exists users (
  id int unsigned not null auto_increment,
  username varchar(100) not null,
  password binary(60) not null,
  first_name varchar(100) not null,
  last_name varchar(100) not null,
  role_id int unsigned not null,
  primary key(id),
  unique(username)
);

create table if not exists roles (
  id int unsigned not null auto_increment,
  role varchar(100) not null,
  primary key(id),
  unique(role)
);

Я думаю, что мне нужно нормализовать первую таблицу, например, разбить первую таблицу на некоторый вид user_info (first_name, last_name, ...) и учетной записи (username, password, role_id).У меня проблема в том, что я очень неуверен в том, зачем мне это нужно, потому что не могу объяснить, почему это не в 3NF.

РЕДАКТИРОВАТЬ

Пользователь может иметь только одну роль (admin, poweruser, user).

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Вам необходимо разделять информацию о пользователе и информацию об учетной записи только в том случае, если у пользователя может быть несколько учетных записей или в одной учетной записи может быть несколько пользователей.Если отношение пользователя к учетной записи всегда 1: 1, то вы нормализуетесь как есть.

Иногда имеет смысл выделять столбцы в отношении 1 к 1, если столбцы ввторая таблица будет использоваться редко.Однако в этом случае кажется, что обе таблицы будут заполнены всегда, поэтому разделить эти столбцы нечего.

2 голосов
/ 29 июня 2011

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

0 голосов
/ 28 июня 2011

Я не эксперт по SQL, но эта таблица выглядит очень нормализованной для меня.Для экономии места следует нормализовать таблицу:

Если у вас есть столбец, например role, и у вас 20 пользователей с 5 ролями, в каждой роли используется 10 байт, у вас будет 20 * 10bytes = 200bytes.

Но если вы нормализуете таблицу, как вы уже это сделали, вам понадобится 5 * 10bytes = 50bytes для имени роли, 5 * 1byte = 5byte для идентификатора в таблице ролей и 20 * 1byte = 20byte для идентификатора в пользовательской таблице.

  • 200bytes не нормализовано
  • 50bytes + 20bytes + 5bytes = 75bytes в нормализованной форме.

Это только очень неполный и базовый расчет для отображения фона.

...