Однажды я использовал пары ключ-значение в базе данных с целью создания электронной таблицы (используемой для ввода данных), в которой кассир суммировал бы свою деятельность, работая в кассе. Каждая пара k / v представляла именованную ячейку, в которую пользователь вводил денежную сумму. Основная причина такого подхода состоит в том, что электронная таблица сильно подвержена изменениям. Новые продукты и услуги добавлялись регулярно (таким образом, появлялись новые ячейки). Кроме того, определенные клетки не нужны в определенных ситуациях и могут быть отброшены.
Приложение, которое я написал, было переписано как приложение, которое разбивало лист кассира на отдельные секции, каждая из которых представлена в отдельной таблице. Проблема заключалась в том, что по мере добавления продуктов и услуг требовались изменения схемы. Как и во всех вариантах дизайна, есть свои плюсы и минусы в том, чтобы выбрать одно направление по сравнению с другим. Мой редизайн, безусловно, выполнялся медленнее и быстрее занимал место на диске; однако он был очень гибким и позволял добавлять новые продукты и услуги в считанные минуты. Однако единственное, что следует отметить, это потребление диска; не было никаких других головных болей, которые я могу вспомнить.
Как уже упоминалось, причина, по которой я обычно рассматриваю подход пары ключ-значение, заключается в том, что пользователи - это может быть владелец бизнеса - хотят создавать свои собственные типы, имеющие набор пользовательских атрибутов. В таких ситуациях я пришел к следующему определению.
Если нет необходимости извлекать данные по этим атрибутам или поиск может быть отложен до приложения после извлечения фрагмента данных, я рекомендую хранить все атрибуты в одном текстовом поле (с использованием JSON, YAML, XML , так далее.). Если есть необходимость извлекать данные по этим атрибутам, они становятся беспорядочными.
Вы можете создать одну таблицу «атрибутов» (id, item_id, key, value, data_type, sort_value), в которой столбец сортировки охватывает фактическое значение в виде с сортировкой по строке. (например, дата: «2010-12-25 12:00:00», номер: «0000000001») Или вы можете создавать отдельные таблицы атрибутов по типу данных (например, string_attributes, date_attributes, number_attributes). Среди многочисленных плюсов и минусов обоих подходов: первый проще, второй быстрее. И то и другое заставит вас писать некрасивые сложные запросы.