Ответы пользователя по тегу Проектирование баз данных
  • Можно ли создать базу данных на одной таблице?

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