Я работаю над веб-сайтом, который будет похож на торговую площадку, где зарегистрированный продавец может продавать различные виды товаров. Для каждого элемента есть общие атрибуты и дополнительные атрибуты. Посмотрите на следующее, я постараюсь объяснить.
На самом деле у нас есть таблица под названием Предметы который содержит все предметы для продажи и еще одну таблицу под названием 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.
Я отдаю приоритет производительности веб-сервера / базы данных, но я бы также избежал проблем с запросами. Более того, дополнительные атрибуты будут использоваться только для отображения технических характеристик в таблице, а не для фильтрации / сортировки. Итак, по вашему мнению, как лучше всего этого добиться?
Вы можете попробовать использовать таблицы 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 для хранения информации об элементах для повышения производительности.
Других решений пока нет …