Skip to content

Модель данных в базе данных

Сущности

На данный момент у нас есть сущности products и categories. Отношение между ними - many-to-many. Один продукт может находиться в нескольких категориях (с учетом того, что конкретный магазин маркетплейса тоже можно рассматривать как категорию).

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

image

Данные

Исторически название полей в реляционных базах данных должно быть snake_case, но современные БД хорошо различают регистр, и поэтому удобно именовать поля так же, как они будут в JavaScript на фронтенде - тогда можно избежать преобразования имен туда-обратно, что зачастую может вылиться в очень немаленький бойлерплейт на бэкенде.

Categories table

image

Products table

image

Category-product join table

image

В классических реляционных базах данных все данные находились в таблицах, большинство полей (колонок таблиц) было либо числом, либо строкой, либо timestamp. Соответственно, для firstName пользователя было своё поле, для lastName - своё. В итоге у Magento, например, свыше 200 таблиц в минимальной версии, и у некоторых таблиц могут быть десятки полей.

JSON поля сильно упрощают работу с данными и таблицами. В нашем случае у products есть два json поля - desc и data. В первом будут храниться данные, которые надо передать на фронтенд при запросе категории товаров (краткая информация по товарам), в data - уже полное описание товара для показа на странице товара, включая, например, отзывы пользователей. data будет намного больше по объему, чем desc. Это позволит делать запросы на бэкенд эффективно.

Поиск по json полям

Одно из преимуществ реляционных баз данных - индексация полей и быстрый поиск по ним даже с десятками миллионов записей в таблице.

У нас есть форма поиска на сайте, мы, естественно, захотим искать по полному описанию товара, который находится в поле data таблицы products. Это тоже возможно, потому что MySQL, например, по каждому параметру внутри json поля, по которому должен быть поиск, создает дополнительное виртуальное поле в этой таблице, и индексирует его для оптимизации поиска или join-ов. Postgres наверняка делает примерно то же самое. Таким образом, хранение данных в json полях не ограничивает функционал реляционных баз данных.