Нормальна ли такая нормализация РБД?

123 4
P
На сайте с 16.06.2008
Offline
14
1754

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

Получается создаём:

1 таблицу с общими полями (id, name, login, password)

1 таблицу с группами (id,name,...)

и по таблице для каждой группы пользователей (Модераторы, Техподдержка, Админы), которые связываем 1:1 с таблицей общих полей (логин, пароль).

Нормальна ли такая нормализация?

Почему спрашиваю? Потому что, кое-где пишут, что если есть связь 1:1, то она ошибочна.

Turtle_Fly
На сайте с 20.09.2007
Offline
33
#1

Я бы сделал так:

1. user_table: id, login, pass, group (id из таблицы групп)

2. group_table: id, group_name

3. group_param: id, param, group (id из таблицы групп)

лазерные станки для резки и гравировки, купить в Москве (http://laser911.ru/). изготовление табличек для офиса (http://www.shtampuem.ru/tablichki/).
P
На сайте с 16.06.2008
Offline
14
#2

Turtle_Fly, не совсем понятно. Допустим у пользователей "преподаватели" зарплата, а у пользователей "студенты" - стипендия. Куда вы занесёте сумму, и как потом узнаете где зарплата и где стипендия?

prometex добавил 11.12.2008 в 11:42

В любом случае Вы не сможете задать тип данных для каждого параметра. У Вас поля и возраст и должность и дата и время будут иметь одинаковый тип varchar или ещё хуже text

Alipapa
На сайте с 01.02.2008
Offline
234
#3

Если связь 1:1, то эти таблицы могут быть слиты в одну. Почему вы так не хотите сделать? Либо у вас не совсем 1:1, либо по каким-то причинам (много полей например) вы хотите оптимизировать запросы. В принципе, это не нарушение, но чаще оно просто не нужно.

Биржа фриланса - простая и удобная (http://kwork.ru/ref/2541)
P
На сайте с 16.06.2008
Offline
14
#4

Alipapa, предлагаете сделать так:

user_groups (id, name, rights)

user_students (id, group_id, name, login, password, grants, ...)

user_teachers (id, group_id, name, login, password, salary, ...)

И при авторизации проверять каждую таблицу на соответствие login/password, и в процессе добавления пользователей следить чтобы login не совпадал с логинами из других таблиц?

prometex добавил 11.12.2008 в 12:06

Или так:

user_groups (id, name, rigths)

users (id, group_id, name, login, password, grants=NULL,salary=NULL, ...=NULL, 63-е ... =NULL)?

Чтобы получилась таблица с несколькими сотнями полей?

Alipapa
На сайте с 01.02.2008
Offline
234
#5

Да, именно последний вариант классический. Но если у вас набор необходимых полей для каждой группы отличается и этот набор большой, то ваш подход правильный. И вообще, по-моему, у вас не 1:1, а 1:много - тогда тем более все нормально.

P
На сайте с 16.06.2008
Offline
14
#6

Именно 1:1

user_groups (id, name, rights)

users (id, group_id, name, login, password)

students (user_id, age, progress, grant)

teachers (user_id, hours, class, salary)

Выходит это единственное оптимальное решение..

Alipapa
На сайте с 01.02.2008
Offline
234
#7

А если количество юзеров не десятки тысяч и таблица будет грамотно проиндексирована - серверу будет раз плюнуть выбрать и обработать эти данные. Поэтому может быть и стоит последнему варианту внимание уделить?

Alipapa добавил 11.12.2008 в 12:43

Ну не вижу я, по какому полю какие таблицы в вашей схеме 1:1 связаны.

Alipapa добавил 11.12.2008 в 12:45

Кстати, пока я писал, не видел вашего последнего поста. Нормальная у вас схема, правильная.

P
На сайте с 16.06.2008
Offline
14
#8

Если взять 20 групп по 15 параметров в каждой, то получим таблицу, у которой будет 300 полей!

Причём каждая запись будет заполнять только 15, а остальные 285 будут NULL - это лучше чем связь 1:1?

Alipapa
На сайте с 01.02.2008
Offline
234
#9

user_groups (id, name, rights)

users (id, group_id, name, login, password)

students (user_id, age, progress, grant)

teachers (user_id, hours, class, salary)

Где здесь связь 1:1 ? Какие таблицы по каким полям так связаны? При всей моей фантазии могу найти только 1:много

P
На сайте с 16.06.2008
Offline
14
#10

Странно..

users:id (primary, autoincrement)

students:user_id (primary) -> users:id

teachers:user_id (primary) -> users:id

Пример записи

users:id [1,2,3,4,5,6,7,8]

students:user_id [1,2,3]

teachers:user_id [4,5,6]

sometable:user_id [7,8,...]

123 4

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий