#database-design
#database-design
Вопрос:
Я начинаю новый проект. На данный момент этот проект находится на стадии планирования и проектирования, но есть одно препятствие, которое я могу придумать для решения, но оно не кажется наиболее оптимизированным или организованным. Любая помощь приветствуется.
У меня есть следующие варианты использования:
- Пользователь может создать событие (например, физическое событие, такое как гонка или фестиваль), это «координатор».
- Этому новому событию может быть назначено ноль или более рабочих для работы с событием. У них будет доступ к дополнительным инструментам / данным о событии.
- В этом событии может быть ноль или более участников, которые зарегистрируются через эту службу.
- Любой незарегистрированный пользователь может найти страницу с подробной информацией о событии
Я пытаюсь разобраться, как создать базу данных, которая эффективно хранит эту информацию. Особенно, если мы планируем масштабировать до кто знает, сколько событий. Прямо сейчас я имею в виду следующее. В дизайне базы данных есть еще кое-что, но в основном это просто данные для аутентификации и пользовательские данные, поэтому я их не включаю — дайте мне знать, если будет полезно увидеть полный дизайн в его нынешнем виде.
USER
-----------
id (pk)
EVENT
-----------
id (pk)
coordinator (fk, references USER.id)
page
workers
participants
//workers and participants are lists of USER.ids
Это довольно просто, но я вижу, что это эффективно только в одном направлении, а не в обоих. Будет очень просто выполнить запрос, чтобы найти работников и участников любого данного события, но будет очень сложно найти события для любого данного пользователя.
Любые мысли / критические замечания будут очень полезны. Спасибо.
Ответ №1:
На самом деле это должно быть довольно легко поместить в RDMS. Вам просто нужна серия отношений «Многие ко многим» для работников и участников. Вы также можете сохранить в этой таблице все, что вам нужно, что относится к этому участнику / работнику для этого события.
User
----
ID
Events
------
ID
Participants
-----------
User ID
Event ID
Workers
-------
User ID
Event ID
Если нет других данных для хранения с участниками и рабочими, вы можете просто использовать одну таблицу и указать их статус
SignUps
-------
EventID
UserID
Type ( W | P )
Вы могли бы даже сделать координатора таким образом, на случай, если когда-нибудь появится возможность для мероприятия иметь сокоординаторов
Комментарии:
1. Я думаю, что это то, куда я хотел пойти. Я вижу, что это будет намного понятнее и, вероятно, также будет лучше масштабироваться. Спасибо.
Ответ №2:
Комментарии:
1. Я думаю, что это может быть более достоверным, чем первое, которое я прочитал. Поправьте меня, если я ошибаюсь, но это более четко объясняет, что один человек является координатором одного мероприятия и участником другого.
Ответ №3:
Вы можете использовать массивы идентификаторов в чем-то вроде MongoDB, но не (эффективно) в базе данных на основе SQL, такой как SQL Server или MySQL AFAIK.
Вместо этого, если вы не используете базу данных без SQL, используйте таблицу сопоставления для хранения отношений между событиями и рабочими, а также событиями и участниками.
Комментарии:
1. Я не знаком с Mongo или NoSQL (кроме того, что знаю, что они существуют). Тем не менее, спасибо.
2. Да, я тоже с ними не очень знаком. Но одна из вещей, которая мне понравилась из того, что я прочитал, заключается в том, что фактически допустимым типом данных является наличие поля в виде массива идентификаторов, которое затем довольно легко запрашивать.