Вы используете модель базы данных с именем Entity-Attribute-Value . Это распространенный способ хранения пар ключ / значение в реляционной базе данных, но он имеет ряд недостатков в отношении нормализации и эффективности базы данных.
Да, дизайн таблицы, который вы показали, является наиболее распространенным способом сделать это. В этой схеме каждый атрибут каждой сущности получает отдельную строку в вашей таблице KeyValue
.
Применение пары ключ / значение к группе элементов: Необходимо добавить одну строку для каждого элемента в группе.
INSERT INTO KeyValue (id, key, value) VALUES (101, 'color', 'green');
INSERT INTO KeyValue (id, key, value) VALUES (102, 'color', 'green');
INSERT INTO KeyValue (id, key, value) VALUES (103, 'color', 'green');
Вы также можете подготовить оператор INSERT с параметрами и выполнить несколько идентификаторов элементов в цикле или что-то еще.
Перечислите все текущие активные ключи:
SELECT DISTINCT Key FROM KeyValue;
Определить все элементы, которые имеют значение для данного ключа:
SELECT id FROM KeyValue WHERE Key = 'color';
Определить все элементы, для которых значение, связанное с данным ключом, соответствует некоторым критериям:
SELECT id FROM KeyValue WHERE Value = 'green';
Некоторые проблемы с Entity-Attribute-Value:
- Нет способа убедиться, что ключи написаны одинаково для всех предметов
- Нет способа сделать некоторые ключи обязательными для всех элементов (т.е. НЕ ПУСТО (NULL) в обычной схеме таблицы).
- Все ключи должны использовать VARCHAR для значения; нельзя хранить разные типы данных для каждого ключа.
- Нет способа использовать ссылочную целостность; невозможно создать FOREIGN KEY, который применяется к значениям некоторых ключей, а не других.
По сути, Entity-Attribute-Value не является нормализованным дизайном базы данных.