Модель данных в базе данных
Сущности
На данный момент у нас есть сущности products
и categories
. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).
В реляционных базах данных такие отношения делаются отдельной таблицей, которая хранит связи между товарами и категориями.
Данные
Исторически название полей в реляционных базах данных должно быть snake_case
, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.
Categories table
Products table
Category-product join table
В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.
JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у products
есть два json поля - desc
и data
. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data
- уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data
будет намного больше по объему, чем desc
. Это позволит делать запросы на бэкенд эффективно.
Поиск по json полям
Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.
У нас есть форма поиска на сайте, мы, естественно, захотим искать по полному описанию товара, который находится в поле data
таблицы products
. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json
поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое. Таким образом, хранение данных в json полях не ограничивает функционал реляционных баз данных.