Я когда-то использовал пары ключ-значение в базе данных с целью создания электронной таблицы (используемой для ввода данных), в которой кассир суммировал свою деятельность с работой денежного ящика. Каждая пара 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). Среди многочисленных плюсов и минусов обоих подходов: первое проще, второе - быстрее. Оба заставят вас писать уродливые сложные запросы.
ORM упрощает запрос, но не повышает производительность. Ручной кодированный SQL-запрос может дать лучшую производительность. – mansu 2009-05-27 16:33:29
Это может быть. Но, вероятно, нет, и скорость не была чем-то, о чем он просил. – 2009-05-28 06:00:36