Как создать базу данных / объекты в сложной ситуации - PullRequest
0 голосов
/ 08 декабря 2018

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

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

Событие

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

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

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

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

Пример complexEventType может выглядеть следующим образом:

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

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

  • Должен ли я создать подкласс Event InSte?объявление о сохранении свойства 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.Затем для каждого типа события я мог бы создать класс, который реализует этот интерфейс и добавляет опции.Однако я не знаю, как это будет сохранено в базе данных ...

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

...