Ответы пользователя по тегу SQL
  • Несколько бд или одна?

    agoalofalife
    @agoalofalife
    Team Lead
    Внесу своих 5 копеек на чаше весов.
    Мне кажется рассматривать database - без потребителей этих данных не совсем реалистично.
    Я имею в виду, что надо отталкиваться от бизнеса, насколько все эти базы будут жить в согласованности, так как данные бизнеса имеют зависимости.
    История платежей пользователей - нуждается наверное в пользователях, они скорее всего хранятся в другом месте(в другой базе). Новости тоже могут иметь зависимости(например комментарии, кого?пользователей) Сложно сказать однозначно в этой ситуации, не вижу всей картины.
    Но..В разных базах есть смысл хранить данные, когда есть концептуальное разделение.
    Например история платежей - это частный случай, неких выплат. Выплаты можно выделить в отдельный контекст и формализовать.
    Надо исходить из предметной области, так как очевидно что ваши конечные пользователи не напрямую из базы читают, есть еще код, который организует это.
    Неизвестен масштаб проекта, если всего один разработчик, тогда какое преимущество даст разделение?Оно просто внесет сложность, трату времени и денег. Если бизнес стал развиваться, то скорее это нужда а не философский вопрос.

    Еще есть вариант, просто наделать баз в одном монолитном проекте, но такое я еще не видел. Лишать себя связей между таблицами в реляционной базе, должен быть веский повод.
    Ответ написан
    Комментировать
  • Нормализация базы данных?

    agoalofalife
    @agoalofalife
    Team Lead
    Часто бывает что выгодно делать именно денормалазацию данных. Тут как везде борьба компромиссов.
    Я тут накидаю своих размышлений а у вас будет почва для дополнительных раздумий.
    Для наглядности я сюда схему прикрепил
    5fd339050f4b3128986508.png

    Нормализация
    Группы, инструменты, музыканты сейчас нормализованы, и они храняться в отдельных таблицах.
    Преимущества:
    - Мы можем переиспользывать эти данные
    - В других таблицах, это внешний ключ и мы получаем индекс
    - База следит за целостностью информации(то есть, если мы добавляем новый состав, группа должна существовать. Если мы захотим удалить группу, база данных может нам запретить это сделать так как у нас есть записи в таблице состав группы. Это уже настройки restrict or update) На первый взгляд не самое очевидное, но важное преимущество тем не менее.
    И вот почему, мы можем денормализовать эти таблицы, добавляя как строку в pivot table(таблица составов и остальные что ниже на диаграмме) вместо внешнего ключа:
    - Меньше запросов при insert
    - Если сделать индекс, не надо ходить за id в верхние таблицы, но ...
    Собственно весь мир стремиться к хаосу и код не исключение. Давая повод для вставки простой строки, мы провоцируем все это на хаос. Может вы знаете конечный список групп, но кто то не знает и может вставить что угодно, соответственно из за этого будет проблемы.

    Подход от бизнеса
    Стоит учитывать так же, что не всегда и не везде нужны например составы групп. Возможно требуется только актуальный сейчас, а те что были хранятся для истории. Тогда схему можно переорганизовать, и добавить хранение только текущих музыкантов, а историю с логом выносить в другое место.
    Следует задавать себе вопросы:
    - А как может быть дальше?
    - Какие могут быть выборки, вставки, добавление и далее?(возможно вам надо выбрать другой тип хранения, где отсутствует транзакции и очень быстрая выборка(MyISAM для примера)
    - Какое кол-во данных будет храниться?Что будет добавлять регулярно а что нет?
    И многие другие вопросы(они будут увеличиться с опытом)
    Отчасти усложнять сис-му в начале не стоит(но думать об этом надо), добавить индексы, денормализацию и так далее, делают скорее после под обстоятельства.

    Работа в самом коде
    Возможно вас пугает кол-во вставок при такой архитектуре. Это реляционная база данных, и связи одно из главных вещей(преимуществ) и она отражена в названии.
    В коде это организуется конечно иначе, в зависимости от использования подхода к работе с базой.
    Это может быть:
    - Active Record(Eloquent - laravel)
    - Data mapping (Doctrina - Symfony)
    Не углубляясь в подробности, часть будет инкапсулирована и вставка будет проще(в самом коде).
    Зависит так же от интерфейса, при том примере что у вас выше:
    В окне пользователя будет вводиться сразу вся информация.
    И это не всегда так, в зависимости от подхода(может быть SPA приложение), в одном окне может добавляться состав группы, в другом из form select, набираться музыканты в этот состав.
    Резюмируя - реляционная база это кончено связи. Можете попробовать организовать такое в NoSQL. Таблицы что выше, кто - то называет их справочниками.(можно организовать кэш по ним, если они не изменяются, а только переиспользуются и добавляются новые).
    Надеюсь хоть в чем то вам помог.
    Ответ написан
    1 комментарий