Каков наилучший способ добавить пользователей в несколько групп в базе данных? - PullRequest
3 голосов
/ 18 сентября 2008

В приложении, где пользователи могут принадлежать к нескольким группам, я в настоящее время храню их группы в столбце с именем groups в виде двоичного файла. Каждые четыре байта представляют собой 32-разрядное целое число, равное GroupID. Однако это означает, что для перечисления всех пользователей в группе мне нужно программно выбрать всех пользователей и вручную выяснить, содержат ли они эту группу.

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

Другой способ - создать отдельную таблицу, связывающую пользователей с группами. Один столбец называется UserID, а другой - GroupID.

.

Какой из этих способов будет лучшим для этого? Или есть лучший способ?

Ответы [ 5 ]

10 голосов
/ 18 сентября 2008

У вас есть отношения многие ко многим между пользователями и группами. Это требует отдельной таблицы для объединения пользователей с группами:

User: (UserId[PrimaryKey], UserName etc.)
Group: (GroupId[PrimaryKey], GroupName etc.)
UserInGroup: (UserId[ForeignKey], GroupId[ForeignKey])

Чтобы найти всех пользователей в данной группе, вы просто говорите:

select * from User join UserInGroup on UserId Where GroupId=<the GroupId you want>

Практическое правило. Если вам кажется, что вам необходимо кодировать несколько значений в одном поле, вам, вероятно, нужен внешний ключ для отдельной таблицы. Ваши приемы с использованием байтовых блоков или символов Unicode - это просто умные приемы для кодирования нескольких значений в одном поле. При разработке базы данных не следует использовать хитрые уловки - сохраните это для кода приложения; -)

2 голосов
/ 18 сентября 2008

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

1 голос
/ 18 сентября 2008

Более стандартный, удобный и понятный способ - это таблица соединений. Он легко поддерживается многими ORM, кроме того, что в большинстве случаев он достаточно эффективен. Входите «умными» способами только в том случае, если у вас есть причина, скажем, миллион пользователей и необходимость отвечать на этот вопрос каждые полсекунды.

0 голосов
/ 18 сентября 2008

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

0 голосов
/ 18 сентября 2008

Я бы сделал 3 таблицы. пользователи, группы и группы пользователей, которые используются в качестве таблицы перекрестных ссылок для связи пользователей и групп. В таблице групп пользователей я бы добавил столбцы userId и groupId и сделал бы их первичным ключом. КСТАТИ. Какие соглашения об именах существуют для именования этих таблиц внешних ссылок?

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