За последние 24 часа нас посетили 22577 программистов и 1280 роботов. Сейчас ищут 818 программистов ...

Как правильно спроектировать архитектуру?

Тема в разделе "MySQL", создана пользователем myks92, 10 июн 2019.

  1. myks92

    myks92 Новичок

    С нами с:
    12 июн 2018
    Сообщения:
    45
    Симпатии:
    1
    Всем привет! Я уже задавал подобный вопрос. Мне тут хорошо помогли! Теперь у меня есть небольшие сложности по связям. Хотел бы снова попросить помощи специалистов!) Немного переделал архитектуру и названия таблиц из прошлого вопроса...

    Кратко о проекте:

    Необходимо реализовать Календарь мероприятий с регистрацией на них. Примерно 800 мероприятий в год. Около 1000 заявок на каждый период. В каждой заявке может быть от 1 до 100 участников. База mysql.

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

    Разделы
    1. Организации (organizations)
    2. Люди организации (organization_persons)
    3. Дисциплины (disciplines связующая таблица с отдельными таблицами ages, kidns, levels, nominations)
    4. Города
    5. Мероприятия (events)
    6. Периоды мероприятия/даты проведения (event_periods)
    7. Система регистраций - здесь создаем различные сервисы для регисрации. Регистрации могут быть: соревнования, батлы, мастер-классы ... (registration_services)
    8. Регистрации соревнования (competention_registrations)
    9. Дисциплины регистрации (competition_disciplines) ссылается на таблицу дисциплин и получение полного названия через метод getName() в коде
    10. Цены на участие в дисциплине (comp_discipline_prices)


    У меня получилась такая структура: https://dbdiagram.io/d/5cfad2ca09a99609d6145a6a

    Вопросы:
    1. Нужно ли в таблице competition_disciplines делать primary key и сурогатный id?

    2. Я сделал две связи из таблицы competention_registrations на:
    - competition_disciplines на поле discipline_id (competition_disciplines.discipline_id)
    - disciplines на поле id (disciplines.id)
    Это сделано для того, чтобы можно было в коде обращаться к двум разным таблицам.
    Например, если мне нужно получить название дисциплины, то используем ->getDiscipline->getName(). Если мне нужно получить количество регистраций, то используем ->getCompDiscipline()->getRegistrationCount(). Что позволит уменьшить кол-во запросов.

    Используется ли такая практика в MYSQL с дублированиями связей? Или лучше оставить одну связь с таблицей competition_disciplines и через эту таблицу получать данные из таблицы disciplines?

    3. В моей системе есть несколько типов регистрации, которые выбирает пользователь. Это соревнования (competitions), мастер-классы (masterclases), батлы (battles). В схеме базы реализована пока что только регистарция на соревнования (competitions). Для этих регистраций мне нужно будет реализовывать различные настройки: дата открытия, дата закрытия, базовая валюта, отправлять сообщения, регистрация оплачена и так далее. У меня возник вопрос как хранить такие настройки и как их связывать с проектом? Пока что я это сделал таблицей registration_services и связал её с периодами. Правильно ли я сделал?

    Либо лучше делать под каждый тип свои настройки competention_settings, masterclass_settings, etc...
    И как лучше связывать эти настройки?

    Если есть ещё какие-то неразумные вещи - говорите)) Я буду очень вам благодарен! Надеюсь, что после ваших ответов вопросов этого модуля больше не будет!)