2010-04-14 3 views
1

У меня есть модель, скажем, пункт. Я хочу сохранить на нем произвольное количество атрибутов, например title, description, release_date. И я хочу, чтобы они были не просто строками, а типами python, поэтому string, boolean, datetime и т. Д.Произвольные типизированные данные в модели django

Какие у меня варианты? Шаблон EAV с отдельной таблицей значений имен не будет работать из-за того же типа DB для всех значений. Например, JSONField может помочь, но он не знает о дате времени, например. Также я смотрел на PickeField, он идеально вписывается, но я немного обеспокоен производительностью.

ответ

4

У вас есть пара вариантов, и ни один из них не является отличным. Некоторые из них обсуждались before о переполнении стека.

Во-первых, как вы и предположили, у вас есть шаблон дизайна объекта-атрибута.

  • Вы можете добавить проверку типа БД, имея таблицу для VARCHAR и одну для INT и одну для BOOLEAN и т. Д.
  • EAV делает выбор очень болезненным. Вы должны запросить несколько таблиц, чтобы фактически получить объект, и если вам нужно использовать значения из таблицы EAV в поиске, вы столкнетесь с проблемами производительности по мере увеличения размера.
  • В общем, однако, EAV действительно должен использоваться только для очень редких данных, где другой вариант просто не работает.
  • Для PyPI есть пакет Django, но я его не использовал.
  • Я видел некоторые довольно крупномасштабные коммерческие продукты, которые используют этот подход, когда много гибкости абсолютно необходимого

Немного лучше подход иметь таблицу, изменения схемы и таблицы метаданных, которая описывает эту таблицу , Для плотных данных, где большинство элементов имеют большинство атрибутов, это имеет много преимуществ перед EAV. Этот подход иногда называют динамическими таблицами или динамическими строками.

  • Вставка, обновление и удаление гораздо быстрее, так как все в 1-2 таблицах
  • проверка
  • Типа и потенциально ограничения могут быть добавлены
  • Однако такой подход оставляет очень сложную базу данных, которая может быть сложнее работа с
  • Я не знаю, каким образом Django будет использовать свой ORM с такой базой данных, так как ваши модели будут меняться на лету.
  • Вы изменяете свою базу данных с помощью ALTER TABLE на лету. Лучше быть очень осторожным с транзакциями

Хорошим подходом, если вам не нужно выполнять поиск на основе этих динамических атрибутов для хранения динамических данных в JSONField или еще лучше схема утверждена XMLField. Однако поиск будет болезненным, если вам нужно искать на основе динамического атрибута, который является частью вашего JSON или XML.

Лучший подход зависит от того, насколько разрежены ваши данные и как вы будете искать эти данные. Кроме того, очень хороший вопрос, чтобы спросить, нужна ли вам эта гибкость. Я работал над некоторыми проектами, в которых мы решили, что нам нужен EAV, но поскольку проект вошел в производственные атрибуты, редко добавляются и редко удаляются, поэтому у нас есть все недостатки и ни одно из благословений.

Смежные вопросы