hstore, как правило, является хорошим решением для этого, но лично я предпочитаю использовать простой ключ: таблицы значений.Одна таблица с определениями, другая таблица со значениями и отношение для привязки значений к определению и отношение для привязки значений к определенной записи в другой таблице.
Почему я против hstore?Потому что это как шаблон реестра.Часто упоминается как пример анти-паттерна.Вы можете поместить туда все, что трудно проверить, если это все еще необходимо, при загрузке целой строки (особенно в ORM) загружается весь hstore, что может иметь много мусора и очень мало смысла.Не говоря уже о том, что необходимо преобразовать тип данных hstore в ваш языковой тип и преобразовать обратно при сохранении.Таким образом, вы получаете некоторые издержки при преобразовании типов.
Итак, на самом деле я пытаюсь преобразовать все hstores в компании, на которую я работаю, в простые таблицы ключ-значение.Это не такая сложная задача, потому что структуры, хранящиеся здесь в hstore, огромны (или, по крайней мере, велики), а чтение / запись объекта тратит огромные накладные расходы на вызовы функций.Таким образом, выполняя простую задачу, такую как «select * from base_product, где id = 1;»заставляет сервер потеть и сильно ухудшает производительность.Хочу отметить, что проблема производительности не в том, что db, а в том, что python должен несколько раз преобразовывать результаты, полученные от postgres.Пока ключ: значение не требует такого преобразования.