2012-02-16 2 views
0

Я думаю о дизайне схемы, который предполагает наличие пользователей и пользовательских ролей, но я не уверен, какой будет лучший маршрут.User Roles DB Schema Design

Вариант 1

Создайте три таблицы, одна с информацией о пользователе, один с информацией о роли и одна с й ролью пользователя отношением.

users { 
    u_id, 
    etc 
} 

roles { 
    r_id, 
    r_name, 
    etc 
} 

user_roles { 
    u_idm 
    r_id 
} 

Вариант 2

Создайте две таблицы, одна с информацией о пользователе, а другой с ролью, роль информации и отношения информации.

users { 
    u_id, 
    etc 
} 

roles { 
    r_id, 
    u_id, 
    r_name, 
    etc 
} 

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

Для масштабируемого решения, которое было бы лучше? Какие еще идеи в моей пропавшей? Это для решения mysql и postgresql.

ответ

1

Вариант 1. Какая польза от роли, если только одна пользователь может иметь каждую роль? Если у вас есть 100 зарегистрированных пользователей, было бы 100 дубликатов определений для "Registered user".

Чем больше «и т. Д.», Тем больше будет ваш дБ.

Наличие такого количества дубликатов замедлит вашу базу данных, и в итоге все будет намного медленнее, даже если у вас есть одно соединение меньше.

Если вы запускаете множество запросов на основе ролей и relel eel, как вам нужна база данных, такая как одна из второй, вы все равно можете создать представление и иметь кэш базы данных, но я сомневаюсь, что это принесет вам пользу.

0

Я бы с первым вариантом с некоторыми изменениями:

- each user can belong to ONLY ONE group 
- create a table defining privileges 
- each group has a list of privileges 

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

Решение прост, гибко и быстро. Таблицы с привилегиями и группами должны быть довольно маленькими, поэтому дополнительные JOINs не будут иметь такого критического эффекта. Кроме того, аутентифицированные пользовательские привилегии могут храниться в сеансе и не загружаться каждый раз. В долгосрочной перспективе будет больше преимуществ, так как решение очень гибкое и легко расширяемое.

Например, вы создадите новый модуль под названием «Конфигурация», и вы хотите создать новую группу пользователей с именем «superadmin», чтобы иметь доступ повсюду и «конфигурацию». Вы просто внесите изменения в базу данных: создайте группу «superadmin», добавьте привилегию «конфигурация», установите все привилегии и все.

+0

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