Задать вопрос
Ответы пользователя по тегу Проектирование баз данных
  • Как лучше сделать базу данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    не затруднит ли в дальнейшем получение информации из базы?

    Затруднит. Причём не "в дальнейшем", а вот уже прямо сейчас.
    С нормальной таблицей получить данные пользователя и его баланс можно одним простым запросом. А с зоопарком из таблиц надо что-то колупать с именами таблиц.
    С нормальной таблицей получить аналитику по финансам в целом можно одним простым запросом. А с зоопарком из таблиц каждый раз придётся собирать запрос вручную в цикле и уродовать свой жесткий диск поскольку сразу БД не сможет получить все данные, а её придётся сначала слить все данные всё равно в одну таблицу, а потом уже по ней искать.
    Ответ написан
    Комментировать
  • Выбор между SQL и NoSQL документооринтированной базой данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Тут нет никакого выбора.

    Первое, что надо понять - это что в "веб приложении", да ещё и с "архитектурой", должна быть база данных. Без неё просто не обойтись. А из всего перечисленного базой данных является только постргес.
    (те, кто почему-то до сих пор не избавился от иллюзий, или просто стал жертвой незамысловатой рекламы, могут почитать, почему MongoDB базой данных не является).

    Второе, что надо понимать - это что в нагруженных приложениях база данных никогда не используется одна сама по себе. Для выполнения различных дополнительных задач используются специализированные движки. Например
    • кликхаус для аналитики
    • редис для кэширования
    • эластик для поиска
    • сентри для логов
    • и так далее - вариантов масса

    Соответственно, если говорить про базу данных, то выбор очевиден - Постгрес.
    Но если речь про поиск, то так и надо формулировать - "что использовать для поиска по базе данных?". И тут ответ тоже будет очевидный - Эластик (ну или любой другой поисковый движок - солр, мантикора, и так далее). Который и будет искать по информации, хранящейся в базе данных.

    Но это только если у вас действительно веб-приложение. Если же у вас стильный энергичный молодёжный стартап, целью которого является проесть деньги инвестора, то Монго - а ещё лучше Равен - будет идеальным выбором. Это же мечта любого говнокодера маститого разработчика - не нужно корпеть над структурой базы данных, мучиться с внешними ключами, вдумчиво расставлять индексы - а просто валить всё в одну кучу!
    Ответ написан
  • Как лучше обновлять счётчик записей?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Лучше всего вообще ничего не обновлять.
    При наличии очевидного индекса на article_id, хоть какие-то проблемы подсчёт на лету начнёт создавать на объёмах уровня фейсбука.
    Так что я бы сначала не со счётными палочками колупался, а проверил наличие индекса.
    Ответ написан
    Комментировать
  • Как создать дизайн базы данных для блог сайта?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Чтобы информация бессмысленно не повторялась, надо не дурацкий JSON городить, а просто не писать заголовок в теле статьи. А выводить его отдельно.
    preview, как правильно сказали выше, лучше писать отдельно, а не брать первый абзац статьи - тогда она будет выглядеть по-дурацки.

    Теги должны лежать в отдельной таблице. Читать про отношение многие ко многим.

    Писать url который slug в базу - занятие дурацкое. slug надо генерить на лету, а искать статью по идентификатору. и чтобы адрес был вида /666/pop-upal-s-kolokolni-i-slomal-nogu
    текст для красоты, id для идентификации
    Ответ написан
    Комментировать
  • Как правильно хранить массив со словарями в MySQL?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    массив в БД э то таблица.
    вложенный массив - это связанная таблица
    по таблице на пользователя никогда не создают
    делается одна таблица, в которой у записи есть id пользователя
    по этому id выбираются все строки, принадлежащие пользователю

    подробнее можно сказать только увидев предполагаемую структуру данных
    про приведенный в вопросе огрызок можно только сказать, что наверное это будет таблица messages с полями id, user_id, role, content
    Ответ написан
    Комментировать
  • Как переорганизовать базу данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Для начала надо познакомиться с какими-то типами полей кроме TEXT
    Например, вместо ТРЕХ колонок day, date и time надо сделать ОДНУ, типа datetime.

    "объединить таблицы с одинаковыми параметрами в одну таблицу, добавив флаг для их различия" - это правильное решение. То есть вместо двух таблиц с логами должна быть одна, вида
    user_id INT (сюда пишется id из таблицы юзеров)
    log_type_id INT (сюда пишется id из таблицы с описаниями логов - название там и прочее)
    host VARCHAR
    dtm DATETIME
    session VARCHAR
    Ответ написан
    Комментировать
  • Можно ли создать базу данных на одной таблице?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    "Унифицированная база данных, в которую бы поместилось все-все бизнес-сущности проекта" где под базой данных имеется в виду таблица - это какой-то нелепый бред. И с какого боку тут EAV - совершенно непонятно.

    Если эта бредовая идея является попыткой решить проблему из предыдущего вопроса, то вам там дали ответ , причем сразу же. Для поиска надо не базу данных корёжить, а прикрутить к ней специальный поисковый движок.
    Движок. Поисковый. Специальный. Прикрутить. Рядом.
    И искать с его помощью. А саму базу данных оставить в покое.
    Если исходная проблема - это поиск, то и решение над искать для поиска.
    Л - Логика.
    Ответ написан
  • Как хранить товары с различными опциями в БД?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В стародавние времена это действительно было проблемой.

    И обычно использовался п.2, который называется EAV, и который в нормальном виде (таблица всех атрибутов, таблица всех значений, и таблица-связка товар-атрибут-значение), хотя и является истинно реляционным решением, служил причиной кровавых слез не одного поколения программистов.

    Эта ситуация послужила одной из причин появления хранилищ для неструктурированных данных, таких как Монго, которые входят в очень широкую категорию NoSQL.
    Но сами по себе "документо-ориентированные базы данных" в качестве основного хранилища - это ад и проклятие, хуже EAV. Если EAV делает адом только работу с атрибутами товаров, то Монга делает проклятием работу со всей БД целиком. Забудьте об этой идее.

    Тем более что в последние годы появилось вполне достойное решение: во всех классических СУБД появилась поддержка JSON полей.
    То есть таблица товаров будет самая обычная, в которой есть общие поля типа цены, названия и прочее. А свойства хранятся в JSON поле. Беря, таким образом, лучшее из двух миров.

    На начальном этапе вы даже сможете делать поиск по атрибутам, используя нативные JSON функции. Но в дальнейшем поиск товаров, а так же фильтрацию по атрибутам на странице категории (так называемый "фасетный поиск") надо будет возложить на специальный поисковый движок (который тоже входит в широкую категорию "NoSQL", хотя ничего общего с документными БД не имеет, и БД, собственно, не является), такой как Эластик или Мантикора.

    Главное при этом хранить (либо в коде, либо в таблице категорий) эталонные структуры таких json полей, которые, во-первых, использовать как справочники для заполнения товаров (тупо чтобы помнить, что частота процессора называется freq, а не frequency), и чтобы собственно делать фасетные фильтры.
    Ответ написан
    5 комментариев
  • Как хранить условия в БД?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хранить виде json, в котором предусмотрены поля для всех возможных критериев. Например weekday.
    При отображении считывать это поле и по нему вычислять скидку.
    Для поиска периодически производить перерасчет
    Пример не вижу смысла писать.
    Ответ написан
    Комментировать
  • Как создать архитектуру БД для заказов продуктов и услуг в приложений?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    У вас какой-то странный магазин был изначально.
    Обычно делается две таблицы, orders и order_details, во вторую пишется состав заказа, в котором фиксируется цена, скидка и все такое прочее.
    Доставка - это не дополнительная услуга, а отдельная сущность, привязанная к заказу, со своими заморочками.
    Остальные доп. услуги - это обычные товары, которые кладутся в корзину.
    Вип статус - плюшка пользователя, а не покупки. При оформлении заказа она просто учитывается при подсчете стоимости.
    Ответ написан
  • Как составить логику бд и запроса?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Надо хотя бы что-то делать самому.
    Обычный inner join выберет только те продукты, который относятся к выбранной стране, и только те подкатегории, которые относятся к этим продуктам (при условии, что подкатегории как-то связаны с продукатми). Ничего "сложного" или каких-то хитрых запросов здесь не нужно.
    Вывести родительские категории чуть сложнее, но тоже надо сначала самому попытаться, а не просить чтобы написали целиком запрос.
    Ответ написан
  • Как лучшего всего хранить неопределенный по размеру массив данных в БД?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Как правильно заметили выше, неопределенный по размеру массив данных в БД - это таблица.
    Ответ написан
    Комментировать
  • Правильно ли составлена схема для магазина?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    В целом правильно, но если уж затеваться с хранением адресов, то тогда в заказе должна быть ссылка на id адреса. иначе просто нет смысла. В целом для такой примитивной схемы отдельное хранение адресов выглядит неадекватным, я бы просто писал адрес в заказ.
    То же самое про телефоны. Просто писать в таблицу юзеров.
    Не хватает емейла. Смс на каждый чих рассылать дорого.

    В таблице заказов очень сильно не хватает поля status. Ну и связанной таблицы с историей статусов.
    Отдельно хранить дату и время - это глупость. Есть тип datetime
    discount - это ОЧЕНЬ отдельная тема. Но по крайней мере скидка должна размазываться по товарам. Если клиент при выкупе откажется от одного, то как пересчитывать цену?
    В целом стоит в заказе дублировать основную инфу по товарам. Потому что её надо показывать в истории заказов, а товара может уже не быть в базе. В том числе цену до скидки и со скидкой.

    Непонятно, что за таблица store.
    Ответ написан
  • Какие размеры данных можно хранить в базе данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Дело не в размере данных, а в их структуре.
    Если хранить данные в виде json, то запросы действительно начнут тупить очень быстро.
    Если создать нормальную структуру и записывать каждый элемент данных в свою ячейку, а json использовать только в исключительных случаях, для заведомо неструктурируемой информации, то даже при объемах в сто раз больше всё будет летать.
    Ответ написан
    Комментировать
  • Как построить структуру данных?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Насколько схема корректная с точки зрения проектирования?

    Непонятно, к чему здесь FeatureProps. Зачем тут многие ко многим?
    ProductProps (product_id, feature_id, prop_id) достаточно

    если я захочу заменить точечно на определённых товарах?


    Скорее всего, это будет уже новое свойство.
    Если захочется переименовать для отдельных товаров, то понадобится таблица feature_names(feature_id, product_id, name), которую лефт джойнить к запросу, и брать имя из неё, если есть.

    Имена таблиц тоже лучше делать в нижнем регистре. Сбережёт некоторое количество нервных клеток.

    На всякий случай предупрежу: Если продукт дойдёт до продакшена, то искать всё равно будете Эластиком. И как следствие - выкините весь EAV за ненадобностью, а все свойства сложите в JSON
    Но для практики конечно поколупаться конечно полезно
    Ответ написан
  • Удалять из бд лайки или ставить isActive = 0?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это пустые страхи.
    Никакой "фрагментации" "диска"в таблице из двух числовых полей (то есть с фиксированным размером записи) не будет. БД прекрасно сама повторно использует ячейки удалённых записей.
    Поэтому, как правильно сказал Akina, мягкое удаление для лайков делать бессмысленно
    Ответ написан
    Комментировать
  • Как спроектировать систему подписок на сайте?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    одна таблица subscribes с вот такой структурой:

    subscribe_id
    subscribe_author_id
    subscribe_object_id

    и, разумеется, выкинуть счетчики из таблицы users
    больше ничего не нужно
    для остального учить базовый SQL. Все подписки пользователя удаляются одним запросом. Все подписчики - тоже.

    Если оставить в стороне нелепые вопросы "а для запроса на удаление тыщи записей какой-то другой SQL нужен?", и вернуться проектированию подписок, то, как правильно подсказывает Slava Rozhnev,

    Во-первых, в таблицу подписок необходимо добавить два составных индекса,
    subscribe_author_id, subscribe_object_id
    subscribe_object_id, subscribe_author_id
    и тогда ужасный запрос count(*) перестанет быть ночным кошмаром, а будет выполняться мгновенно

    А во-вторых, в неё можно добавить внешние ключи, которые будут ссылаться на таблицу users, с опцией каскадного удаления. Тогда отдельный запрос на удаление подписок и вовсе не придётся писать руками, достаточно будет удалить только юзера.

    Запроса на удаление бояться не надо. Этот запрос всего лишь пометит нужные записи, как удалённые, никто файл на диске укорачивать не будет. Потом база данных использует эти же самые ячейки для других подписок.
    Ответ написан
    1 комментарий