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

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

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

    agoalofalife
    @agoalofalife
    Team Lead
    But I also knew, and forgot, Hoare's dictum that premature optimization is the root of all evil in programming

    Надо ответить себе на несколько вопросов:
    - Имеет ли такую нужду(как оптимизация) база данных место быть. У вас есть уже такой трафик?Если да, тогда и правда стоит подумать об этом
    - Надо думать и о доменной(бизнес модели), если в бизнесе такое понятие как contacts или он был придуман вами. Когнитивная нагрузка будет возрастать если например в вашем бизнесе это называют потенциальный заказчик(например). Заходя в структуру базы, без документации, не будет очевидно копирование из таблицы contacts to users.
    - Таблица contacts - это денормализация данных, частая практика для экономии операции чтения, насколько здесь оправдано - не ясно, так как задача вырвана из общего контекста(любое условие или перспектива будущего могут на него повлиять). Если вам надо просто различать состояние user, то вы можете сделать пометку в этой таблице. Если у вас есть дополнительная работа с candidate user(заключение договоров, ведение переговор с сохранением данных об этом и так далее) то есть процесс не мгновенный из одного состояние в другое, то наверное надо хранить в другой таблице.

    Не знаю в каком у вас состоянии находиться проект, на мой взгляд заострять внимание на производительности базы не приоритетный шаг в самом начале.✌️
    Ответ написан
    Комментировать
  • Как вывести название автомобиля один раз и настроить взаимозависимость select(база данных в mysql)?

    agoalofalife
    @agoalofalife
    Team Lead
    Начальный вариант это нормализованные таблицы
    Например:
    - Таблица car_make
    - Таблица car_model
    Где в car_model есть поле car_make_id, это внешний ключ и он уже имеет индекс.
    Далее вы выводите список(form select) из вашей таблицы или поиском(пользователь вводить начало названия) по таблице в car_make
    Пользователь выбирает определенную марку, в таблице car_model вы можете по id выдать список всех моделей.
    Что касательно дат, реализовать можно по разному.
    В вашем файле у вас фиксированный диапазон и его можно добавить в таблицу car_model двумя колонками.
    Если модель может иметь несколько диапазонов выпуска, можно это хранить в отдельной таблице, где поля будут такие:
    car_model_id, start_date, finish_date
    Соответственно при выборе в интерфейсе определенной модели, мы можем выбрать список с диапазонами дат.
    Правильных ответов тут нет, и зависит от целей, какие могут быть перспективы и так далее.

    Например в одном моем проекте был похожий функционал. И использование такой формы, показало что разные марки и модели могут по-разному вводиться пользователями, для примера есть лада и ваз.
    И пользователь будет вводить всегда свою версию.
    В таком случае для каждой модели и марки пришлось заводить отдельные таблицы - словари.
    Где версия пользователя, хранила ссылку на стандартную версию.
    То есть у нас была Лада.
    Соответственно:
    ВАЗ = Лада
    Лада = Лада
    Kalina - Калина
    Ответ написан
    Комментировать
  • Стоит ли выбирать mongoDB?

    agoalofalife
    @agoalofalife
    Team Lead
    Для данных с большим кол-ом связей подходит лучше реляционные базы данных, потому что много связей как правило порождают или находятся рядом с :
    - Со сложными запросами где очень хорошо помогает SQL
    - Большим кол-ом данных, где регламентированная структура только улучшит поддержку
    - Потребность в транзакциях
    Отступая от выше изложенного, так как это учебный проект, то лучше потренироваться опять же на реляционное базе.
    А для опыта сделать два проекта на разных базах, и прочувствовать всю разницу не на словах, а на деле.
    Ответ написан
    1 комментарий
  • Слетела базза данных что делать?

    agoalofalife
    @agoalofalife
    Team Lead
    Для последующих недоразумений хранить весь код в git на удаленных серверах, например bitbucket.
    phpmyadmin это просто интерфейс для работы с базой данных.
    Вам надо было настроить постоянный экспорт и хранить его в другом месте(например в облаке а лучше в двух)
    Если переустанавливали OS то скорее всего данные все стерлись, хотя на сколько я помню иногда можно переустановить оставив старые данные.
    Ответ написан
    1 комментарий
  • Как более производительней вносить и выводить из базы данных?

    agoalofalife
    @agoalofalife
    Team Lead
    Не совсем понято что значит 1, хорошо заданный вопрос это половина ответа.
    Если в базе данные есть данные которые не меняются, их можно закэшировать, получиться намного производительней.
    Ответ написан
  • Нормализация базы данных?

    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 комментарий