Застрял на сложном проектировании базы данных

#database-design

#database-design

Вопрос:

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

У меня есть следующие варианты использования:

  1. Пользователь может создать событие (например, физическое событие, такое как гонка или фестиваль), это «координатор».
  2. Этому новому событию может быть назначено ноль или более рабочих для работы с событием. У них будет доступ к дополнительным инструментам / данным о событии.
  3. В этом событии может быть ноль или более участников, которые зарегистрируются через эту службу.
  4. Любой незарегистрированный пользователь может найти страницу с подробной информацией о событии

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

 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. Да, я тоже с ними не очень знаком. Но одна из вещей, которая мне понравилась из того, что я прочитал, заключается в том, что фактически допустимым типом данных является наличие поля в виде массива идентификаторов, которое затем довольно легко запрашивать.