Задать вопрос

Структура таблиц БД: хранение списков значений наряду с обычными значениями

БД: MySQL.
Задача: хранить словаревидные данные в виде id:int->value:string.
Проблема: оказалось, что иногда нужно, чтобы одному id соответствовал список значений. При этом, если даже список состоит из одного элемента, все равно нужно отличать его от обычного значения.

Я вижу несколько вариантов решения, но ни один мне не нравится.

1) Хранить данные не в виде строки, а в каком-то формате: XML, JSON, etc. Тогда в одно строковое поле можно будет сохранить целый объект.
Вариант не нравится тем, что в итоге получаем денормализацию данных и проблемы, с ней связанные, например, невозможность оперировать значениями списка по отдельности стандартными средствами SQL. Чтение и изменение отдельных элементов прийдется реализовывать средствами приложения.

1.а) Хранить данные в одной строке с разделителем. Это частный случай варианта 1, и минусы те же самые.

2) Создать отдельную таблицу для значений списков.
Вариант не нравится тем, что прийдется делать запросы уже к двум таблицам как при чтении, так и при записи.

3) Хранить все данные в одной таблице, просто не делать id строки словаря уникальным ключом, тогда можно будет добавлять несколько записей для одного id.
Не нравится тем, что тогда сложно определить, является ли элемент обычным элементом, или же частью списка. Добавление специального поля-флага а-ля is_list_element — костыль.
  • Вопрос задан
  • 14855 просмотров
Подписаться 4 Оценить Комментировать
Ответ пользователя edogs К ответам на вопрос (5)
@edogs
Всё-таки если если «списковых» элементов относительно мало, то последний вариант имеет право на существование.
Ответ написан