Каков наилучший способ моделирования базы данных сложного взаимодействия с пользователем? - PullRequest
1 голос
/ 23 марта 2012

В моем веб-приложении у меня будут пользователи, у каждого пользователя будут альбомы, и у каждого пользователя также будут различные пользователи с разрешениями, привязанными к альбому.Я не могу понять, будет ли более эффективно моделировать мою базу данных с помощью набора таблиц с префиксом идентификатора пользователя (например, 10384792_albums) или если у меня будет одна таблица с набором данных внутри (альбомы, которые содержатидентификатор пользователя).Мой предыдущий пример касался альбомов, но для пользователей пользователей это применимо примерно так же.

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

РЕДАКТИРОВАТЬ 1: Таблица пользователей пользователей интересна.Подумайте об этом так: для каждого пользователя на этом сайте у них будет своя уникальная форма входа, где их клиенты могут получить доступ к определенным альбомам.Клиент никогда не будет заходить на мой сайт, используя ту же форму, что и пользователи моего сайта.

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Что-то вроде этого?

User table
----------
ID (primary key)
Username
(more columns with more user info)

Album table
-----------
ID (primary key)
AlbumName
(more columns with more album info)
OwnerID (foreign key to User.ID)

AlbumPermission table
---------------------
ID (primary key)
AlbumID (foreign key to Album.ID)
UserID (foreign key to User.ID)
(more columns indicating permissions)

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

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

Редактировать:

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

Client table
------------
ID (primary key)
ClientName
(more columns with more client info)

User table
----------
ID (primary key)
ClientID (foreign key to Client.ID)
IsAdmin (boolean)
Username
(more columns with more user info)

Album table
-----------
ID (primary key)
AlbumName
(more columns with more album info)
OwnerID (foreign key to User.ID)

AlbumPermission table
---------------------
ID (primary key)
AlbumID (foreign key to Album.ID)
UserID (foreign key to User.ID)
(more columns indicating permissions)

Разница здесь заключается в добавлении таблицы Client, в которую группируются записи пользователя.У записей пользователя теперь есть внешний ключ к записи клиента, так что каждый пользователь является участником ровно одного клиента (клиент-пользователь - один-ко-многим) и поле IsAdmin, указывающее, является ли этот пользователь пользователем административного уровня.для этого Клиента (то есть имеет возможность создавать / изменять записи Пользователя для Клиента).

Ожидается, что у каждого Клиента будет по крайней мере один пользователь.* Не обязательно нужен один в этом дизайне, но имеет смысл создать начальную запись пользователя при создании клиента (пользователя, который регистрирует клиента).

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

0 голосов
/ 23 марта 2012

Конечно, звучит хорошо.Я бы сказал, что ваши отношения будут выглядеть так: usersTable-> OneToMany-> albumTable-> oneToMany-> permissionsTable Тогда permissionsTable-> oneToMany-> usersTable Это базовая нормализация, основанная на ключе.все проиндексировано на pk - если ваши объединения не будут более сложными, это будет хорошо в миллионы записей.Если удаления являются частью плана, разработайте стратегию оптимизации индекса и убедитесь, что все остается в памяти.Посмотрите на indexings permissionsTable (то есть - pk, уровень разрешений), если в объединении есть элементы, отличные от pk.Вы действительно думаете, что вам нужно что-то более сложное?

Если вы действительно беспокоитесь о снежном коме в mysql, посмотрите на прокси tcp, который будет использоваться в качестве очереди перед mysql, поскольку он имеет тенденцию обрабатывать параллельные запросы довольно плохо: смотрите здесь http://flavio.tordini.org/a-more-stable-mysql-with-haproxy

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

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