Одна таблица или несколько

Рейтинг: 2Ответов: 3Опубликовано: 18.02.2015

Посоветуйте определиться. Как лучше хранить пользователей - в одной таблице это будут и клинты, и сотрудники, и админы? Или в отдельной для каждого? Это ведь еще при авторизации нужно будет проверять сначала в одной таблице, есть ли такой пользователь, если нет, то проверять в другой.

Ответы

▲ 5Принят

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

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

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

Оптимальные вариант

Первая таблица является главной и содержит данные идентификации, назовем ее users:

users
-- id
-- login
-- password

Это данные, к которым вы будете чаще других обращаться при проверке на вход.

Вторая таблица содержит роли пользователя (пользователь, админ, модератор, корректор, etc):

role
-- id
-- role

Третья таблица их связывает:

permission
-- id
-- users.id
-- role.id

Теперь вы можете составить запрос, который выберет роль (или роли) из этих таблиц.

Я так же упомянул четвертую таблицу, в ней лучше хранить информацию о пользователе. Просто потому, что к этим данным вы будете не так часто обращаться, как к таблице users, и их желательно выделить в отдельную таблицу.

userinfo
-- id
-- users.id
-- //другие поля

В итоге получается такая структура:

alt text

Из которой уже можно выбрать нужные данные запросом:

SELECT r.role FROM role r
JOIN permission p ON r.id = p.role_id
JOIN users u ON u.id = p.user_id
WHERE u.login = 'Alex'

P.S. Несмотря на кажущееся усложнение структуры, такая модель имеет очень много преимуществ (контроль изменения данных, отделение логических структур, легкий рефакторинг, добавление новых возможностей) и лишена многих недостатков при использовании одной таблицы. Если хотите знать больше про преимущества, изучайте НФ и что они дают.

▲ 3

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

▲ 2

Если брать ваш пример, то как вариант можно так

 - users
 - staff // или groups (как угодно)
 -  - user_admins // для сопоставления
 - clients
 - - user_clients // для сопоставления

Все изначально в таблице users. Если человек с id=10 должен быть админом, то (при условии, что группа администраторов в таблице groups имеет id=2) должна быть запись в user_admins где user_id=10 должен соответствовать group_id=2. Так же и с клиентами.