pro-dev
@pro-dev

Правильно ли сделана связь?

Привет! Подскажите пожалуйста. Есть сущности:
Discipline
- id
- kind 
- nomination
....

Event Discipline
- event 
- id
....

Registration
- id
....
- disipline id
....


Disсipline - это информационная таблица
Event Disсipline - это связующая таблица для конкретного мероприятия.
Registration - Это регистрация на мероприятие, в котором есть поле dicipline_id

Вот всё на php:
Discipline
/**
 * @ORM\Entity
 * @ORM\Table(name="discipline_disciplines", uniqueConstraints={
 *      @ORM\UniqueConstraint(columns={"kind_id", "age_id", "nomination_id", "level_id"})
 * })
 */
class Discipline implements AggregateRoot
{
    use EventTrait;
    /**
     * @var Id
     * @ORM\Id
     * @ORM\Column(type="discipline_discipline_id")
     */
    private $id;
    /**
     * @var Kind
     * @ORM\ManyToOne(targetEntity="App\Model\Event\Entity\Disciplines\Discipline\Kind\Kind")
     * @ORM\JoinColumn(name="kind_id", referencedColumnName="id", nullable=false)
     */
    private $kind;
    /**
     * @var Age|null
     * @ORM\ManyToOne(targetEntity="App\Model\Event\Entity\Disciplines\Discipline\Age\Age")
     * @ORM\JoinColumn(name="age_id", referencedColumnName="id", nullable=true)
     */
    private $age;
    /**
     * @var Nomination|null
     * @ORM\ManyToOne(targetEntity="App\Model\Event\Entity\Disciplines\Discipline\Nomination\Nomination")
     * @ORM\JoinColumn(name="nomination_id", referencedColumnName="id", nullable=true)
     */
    private $nomination;
    /**
     * @var Level|null
     * @ORM\ManyToOne(targetEntity="App\Model\Event\Entity\Disciplines\Discipline\Level\Level")
     * @ORM\JoinColumn(name="level_id", referencedColumnName="id", nullable=true)
     */
    private $level;
    /**
     * @var int
     * @ORM\Column(type="integer")
     */
    private $quantityUse;
}

Event Discipline
/**
 * @ORM\Entity()
 * @ORM\Table(name="event_events_competitions_registrations_diciplines", indexes={
 *     @ORM\Index(columns={"status"})
 * })
 */
class Discipline
{
    public const STATUS_OPEN = 'open';
    public const STATUS_CLOSED = 'closed';
    /**
     * @var Event
     * @ORM\ManyToOne(targetEntity="\App\Model\Event\Entity\Events\Event\Event", inversedBy="events")
     * @ORM\JoinColumn(name="event_id", referencedColumnName="id", nullable=false)
     */
    private $event;
    /**
     * @var Id
     * @ORM\Column(type="event_events_registrations_competitions_discipline_id")
     * @ORM\ManyToOne(targetEntity="\App\Model\Event\Entity\Disciplines\Discipline\Discipline\Discipline", inversedBy="events", cascade={c})
     * @ORM\JoinColumn(name="id", referencedColumnName="id", nullable=false)
     * @ORM\Id
     */
    private $id;
    /**
     * @var Price[]|ArrayCollection
     * @ORM\OneToMany(
     *     targetEntity="\App\Model\Event\Entity\Events\Registrations\Competition\Discipline\Price\Price",
     *     mappedBy="discipline",
     *     orphanRemoval=true,
     *     cascade={"all"}
     * )
     */
    private $prices;
    /**
     * @var string
     * @ORM\Column(type="string", length=16)
     */
    private $status;
}

Registration
/**
 * @ORM\Entity
 * @ORM\Table(name="event_events_competitions_registrations", uniqueConstraints={
 *     @ORM\UniqueConstraint(columns={"event_id", "number"})
 * })
 */
class Registration
{
    /**
     * @var Event
     * @ORM\ManyToOne(targetEntity="App\Model\Event\Entity\Events\Event\Event", inversedBy="events")
     * @ORM\JoinColumn(name="event_id", referencedColumnName="id", nullable=false)
     */
    private $event;
    /**
     * @var Id
     * @ORM\Column(type="event_events_registrations_competitions_registration_id")
     * @ORM\Id
     */
    private $id;
    /**
     * @var Number
     * @ORM\Embedded(class="Number", columnPrefix=false)
     */
    private $number;
    /**
     * @var City
     * @ORM\ManyToOne(targetEntity="App\Model\Event\Entity\Geo\City\City")
     * @ORM\JoinColumn(name="city_id", referencedColumnName="id", nullable=false)
     */
    private $city;
    /**
     * @var Discipline
     * @ORM\ManyToOne(targetEntity="App\Model\Event\Entity\Events\Registrations\Competition\Discipline\Discipline", inversedBy="event")
     * @ORM\JoinColumn(name="discipline_id", referencedColumnName="id", nullable=false)
     */
    private $discipline;
}


Так как эта таблица имеет не только два связующих ключа, но и другие условия, то я решил сделать связь так, что Discipline.Id === EventDiscipline.Id.

Два вопроса:
1. Правильно ли я сделал Discipline.Id === EventDiscipline.Id или лучше это переделать:
- id //Свой уникальный id
- event_id //ID мероприятия
- discipline_id //ID дисциплины

и id у связующей таблицы будет свой, а не из Discipline.Id. Если нужно изменить на такое, то в регистрации я присваиваю id дисциплины. Нужно ли поменять этот id на EventDiscipline.Id?

2. Правильно ли я настроил связи промежуточной таблицы? Если нет, то как правильно?

Если есть какие ещё недочёты? Благодарю!
PS: ID храню как UUID
  • Вопрос задан
  • 78 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы