RDBMS — лучший способ хранить несколько значений ключа, относящихся к одной записи

Я работаю над веб-сайтом, который будет похож на торговую площадку, где зарегистрированный продавец может продавать различные виды товаров. Для каждого элемента есть общие атрибуты и дополнительные атрибуты. Посмотрите на следующее, я постараюсь объяснить.

сценарий

  1. Продавец добавляет новый товар (например, iPhone 6 16 гб черный)
  2. Он строит вставку с указанием атрибутов элемента (например, цена, цена доставки, состояние, изображений, описание, так далее..). Этот вид атрибутов является обязательным и общим для любого элемента.
  3. После того как все обязательные атрибуты заполнены, продавец имеет возможность указать другие виды атрибутов, которые связаны только с этим товаром (например, баран, вместимость, размер, вес, год выпуска, Операционные системы, количество ядер, так далее..). Этот вид атрибутов не является обязательным. Продавец указывает ключ (например, вместимость) и стоимость (например, 16 Гб) и они связаны только для этого единственного элемента. Другая iPhone 6 16 гб черный продается другим продавцом может иметь разные атрибуты.

На самом деле у нас есть таблица под названием Предметы который содержит все предметы для продажи и еще одну таблицу под названием item_attr который содержит общие атрибуты элемента. Таким образом, элемент может быть связан с 0, 1 или более необязательными атрибутами.

Мы работаем над двумя типами подходов для хранения необязательных значений для каждого элемента, но оба могут принести проблемы.

Случай А

Создайте новую таблицу с именем item_additional_attr где каждая запись
будет представлять дополнительный атрибут для одного элемента. Там будет
быть отношения один ко многим между Предметы а также
item_additional_attr. Это, кажется, наиболее «дружественное к базе данных» решение, но я беспокоюсь о размере этого
стол мог иметь. Если Предметы содержит 100.000 записей и каждый
элемент относится в среднем к 5 необязательным атрибутам,
item_additional_attr будет содержать 500.000 записей. Конечно, это будет огромный стол.

Дело Б

Создать новый тип поля TEXT или же BLOB в item_attr называется
optional_attributes. Это поле будет содержать массив необязательных атрибутов и будет обрабатываться в PHP. Конечно массив будет
хранится как сериализованный или закодированный в json. Я думаю, что такой подход может вызвать проблемы с некоторыми запросами, но он может быть обработан без проблем в PHP.

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

0

Решение

Вы можете попробовать использовать таблицы EAV (значение атрибута сущности). В основном вы будете поддерживать несколько таблиц. В одной таблице должен храниться список предметов. Другие таблицы должны поддерживать атрибуты, которые имеют одинаковые типы данных. Я создал простую схему для демонстрации:

+---------+------------+
| item_id | item_name  |
+---------+------------+
|       1 | Cell Phone |
|       2 | Shirt      |
+---------+------------+
2 rows in set (0.00 sec)

+---------+--------------+----------------+-----------------+
| item_id | attribute_id | attribute_name | attribute_value |
+---------+--------------+----------------+-----------------+
|       1 |            2 | storage        | 8GB             |
|       1 |            3 | color          | Gray            |
|       2 |            4 | size           | XL              |
|       2 |            6 | shirt_color    | Red             |
+---------+--------------+----------------+-----------------+
4 rows in set (0.00 sec)

+---------+--------------+----------------+-----------------+
| item_id | attribute_id | attribute_name | attribute_value |
+---------+--------------+----------------+-----------------+
|       1 |            2 | price          |              49 |
+---------+--------------+----------------+-----------------+
1 row in set (0.00 sec)

Первая таблица — это список предметов. Вторая таблица представляет собой список атрибутов элементов типа varchar. В третьей таблице перечислены атрибуты элементов типа int. Это позволит масштабируемую базу данных, которая распределяет атрибуты по нескольким таблицам. Единственным недостатком является количество объединений, которое вам нужно будет сделать, чтобы получить предмет и все его атрибуты. Текстовая схема кэширования может использоваться через php для хранения информации об элементах для повышения производительности.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]