2016-09-01 2 views
2

В моем проекте Django используется postgresql 9.4, который поддерживает поля JSON. Я хотел бы переключиться с реляционной на (частично) нереляционную схему, используя эти поля.Схема нереляционной базы данных для Django с postgres

Скажем, у меня есть модели Foo и Bar и каждый объект Bar принадлежит к одному Foo. В настоящее время я использую ForeignKey от Bar до Foo для моделирования этого, но я хотел бы переключиться на сохранение объектов Bar непосредственно внутри Foo в виде списка экземпляров модели. С postgresql я могу использовать JSONField в Foo, который сохранит список представлений JSON объектов Bar, но тогда мне придется иметь дело с сериализацией в JSON вручную.

MongoDB ORM для Django предоставляет поля Django, чтобы сделать это в чистом виде:

class Foo(models.Model): 
    bar_list = ListField(EmbeddedModelField('Bar')) 

Есть ли способ иметь схожую функциональность бэкэндом Postgres?

ответ

0

Вложенные объекты данных внутри друг друга - это очень не относящийся к реляционной базе данных подход, который не рекомендуется и будет вызывать проблемы с производительностью в реляционной базе данных.

У вас будет несколько проблем, если вы попытаетесь это сделать в Postgres:

  1. Ваши запрашивающие способности на вложенных данных в формате JSON будет ограничен только текст.
  2. Забудьте о сортировке, агрегации и т. Д. Для вложенных данных.
  3. Вам придется иметь дело с сериализацией, когда вам нужны вложенные данные, и перед отправкой обратно в базу данных для сохранения.
  4. Внесение изменений в вложенные модели станет очень тяжелым python, поскольку вы в основном обходите все проверки целостности, которые имеют реляционные базы данных, и хорошие проверки, которые Django имеет для типов и т. Д.
  5. Querying будет медленнее, потому что вам нужно будет извлечь каждый вложенный объект для каждого запроса Foo, поскольку нет способа ограничить количество вложенных объектов, как вы можете в Mongo.

Рекомендация здесь состоит в том, чтобы придерживаться одного типа базы данных Relational или Non-relational и делать то, что хорошо работает на одном.

Если вам нужны Postgres, используйте внешние ключи, и если вы используете Mongo, используйте вложенные объекты.

+1

Спасибо, но я играю с данными в течение нескольких лет, я знаю запросы, которые я запускаю на нем, и я уверен, что мне нужен этот рефакторинг, чтобы ускорить процесс (1. Я не запрашиваю вложенные объекты 2. Мне это не нужно. 3. Это должно быть обработано ORM 4. Изменения в этих моделях уже тяжелые python 5. Есть несколько вложенных объектов, среднее число объектов Bar в Foo близко к одному). – pintoch

+0

Я вижу, что вы приняли это неправильно. Я не стану сомневаться в ваших знаниях данных. Я просто даю вам то, что я испытал раньше, и недостатки этого подхода. Поскольку вам это абсолютно необходимо, вы можете использовать JSONField, доступный с Django 1.9. Он получает объект Python и сохраняет его как JSON, когда он извлекается, get снова разбирается с Python. –

+0

Да, это то, о чем я упоминал в своем вопросе, я просто задавался вопросом, существует ли более высокоуровневая версия этого. Видимо, нет, так что отвечает на вопрос. :-) – pintoch

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

  • Нет связанных вопросов^_^