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