Как создать базу данных / объекты в сложной ситуации

У меня есть приложение Symfony 4, в котором пользователи могут просматривать спортивные события и регистрироваться для этих событий. Я использую Doctrine как ORM и EasyAdminBundle для панели администратора.

У меня возникают трудности с выяснением, как структурировать свои сущности и как вещи должны храниться в базе данных. У меня есть 2 основных лица, Event а также Registration, Я объясню это подробно.

Событие

Event хранит все детали о событии. Есть некоторые фиксированные свойства, которые есть у всех событий, например:

  • id
  • title
  • description
  • startDate
  • endDate (необязательный)
  • isPublic
  • eventType

Как видите, каждое событие имеет тип. Большинство событий просты и не содержат дополнительных свойств. Тем не менее, есть тип события, для которого я хочу сохранить некоторые дополнительные свойства. Я назову этот тип complexEventType отныне и впредь. Я опишу, какие свойства я хочу сохранить для этих событий:

  • Сколько дней проходит мероприятие (это варьируется)?
  • На каждый день: какие действия можно совершить в этот день. Это должно быть редактируемым администратором в панели администратора. Есть такие виды деятельности, как бег, езда на велосипеде, ходьба, но должна быть возможность добавить другие виды спорта.
  • Каждое действие имеет необязательный массив общих параметров (строка). В большинстве случаев они представляют собой расстояния.

Пример complexEventType может выглядеть так:

  • 1 день
    • Ходьба
      • 5 км
      • 8км
      • 12km
    • Бег
      • 10km
      • 12km
      • 16km
    • Езда на велосипеде
      • 30km
      • 40km
      • 60km
  • День 2
    • Ходьба
      • 8км
      • 10km
      • 12km
    • Бег
      • 12km
      • 14km
      • 18km
    • Езда на велосипеде
      • 40km
      • 50km
      • 70km
  • День 3
    • плавание
    • Бег
      • 12km
      • 14km
      • 18km
    • Езда на велосипеде
      • 40km
      • 50km
      • 70km

Здесь возникают некоторые вопросы:

  • Должен ли я наследовать событие вместо того, чтобы хранить type имущество?
  • Если я подкласс, должен ли каждый тип события иметь отдельную таблицу?
  • Вместо того, чтобы создавать подклассы, я должен сохранить options свойство и сделать его обнуляемым, чтобы его не нужно было устанавливать для событий, где нет вариантов?
  • Как сохранить параметры в базе данных? Как объект JSON? Или отдельные таблицы для дней и мероприятий?

Постановка на учет

Пользователи могут зарегистрироваться на события. Их регистрация будет сохранена в Registration объект. Регистрация содержит следующие свойства:

  • id
  • event (ссылка на объект события)
  • user (ссылка на зарегистрированного пользователя)

Если isPublic логическое значение от event является true, событие является публичным, и неаутентифицированные пользователи могут зарегистрироваться для них. В этом случае я хочу сохранить дополнительную информацию:

  • firstName
  • lastName
  • email

В зависимости от eventType собственность от eventнекоторые дополнительные свойства должны быть сохранены. Например, один тип события происходит в другой стране. Для этого типа событий я хочу знать, хочет ли пользователь остаться в отеле (булево) и нормально ли он / она спит в общей комнате (булево). Для другого типа события детали не сохраняются. Для complexEventTypeНам необходимо сохранить данные о том, какие действия пользователь выполняет в какие дни, и выбранную опцию для каждого действия (расстояния).

Я как бы в неведении относительно того, как мне следует подходить к этой ситуации. На данный момент я создал реферат Registration сущность, которая подкласса PublicRegistration а также PrivateRegistration, PublicRegistration сохраняет свойства как firstName а также lastName, в то время как PrivateRegistration хранит указатель на User объект. Прямо сейчас, Registration хранит все возможные варианты, которые все обнуляемы. Это работает, но выглядит не очень хорошо. Я предпочел бы разделить варианты. Я думал сделать RegistrationOptionInterface, Затем для каждого типа события я мог бы создать класс, который реализует этот интерфейс и добавляет опции. Тем не менее, я не знаю, как это будет сохранено в базе данных...

Кто-нибудь может указать мне правильное направление? Кто-нибудь сталкивался с подобной ситуацией раньше, и если да, то как вы ее решили?

0 ответов

Другие вопросы по тегам