2016-09-01 24 views
2

我的Django項目使用postgresql 9.4,它支持JSON字段。我想使用這些字段從關係轉換爲(部分)非關係模式。Django的非關係數據庫模式與postgres

說我有模型FooBar和每個對象Bar只屬於一個Foo。目前,我使用從BarFoo的ForeignKey來建模,但我想切換到將Bar對象作爲模型實例列表直接存儲在Foo中。使用postgresql,我可以在Foo中使用JSONField這將存儲一個JSON表示的列表Bar對象,但是我不得不手動處理序列化爲JSON。

MongoDB的ORM的Django提供Django的領域做,在一個乾淨的方式:

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

有沒有辦法有一個與Postgres後端類似的功能?

回答

0

將數據對象嵌套在對方內是一種非關係型數據庫方法,不推薦使用,並且會導致關係數據庫中的性能問題。

你將有一些問題,如果你嘗試這種在Postgres的:

  1. 你的嵌套JSON數據查詢能力將僅限於文本。
  2. 忘掉排序,聚合等嵌套數據。
  3. 當您需要嵌套數據時,以及在您發回數據庫進行保存之前,您將不得不處理序列化。
  4. 對嵌套模型進行更改將變得非常龐大,因爲您基本上繞過了關係數據庫具有的所有良好完整性檢查以及Django對類型等的良好檢查。
  5. 查詢速度會變慢,因爲您必須爲每個您查詢的Foo檢索每個嵌套對象,因爲沒有辦法像Mongo中那樣限制嵌套對象的數量。

這裏的建議是堅持一種數據庫類型的關係或非關係,並做任何一種工作都很好。

如果您需要Postgres使用外鍵,並且如果您使用Mongo,則使用嵌套對象。

+1

謝謝,但我一直在玩數據現在,我知道我運行它的查詢,我非常確定我需要這個重構來加速事情(1.我不查詢嵌套對象2.我不需要這個3.這應該由ORM來處理4.對這些模型的改變已經是python重5.嵌套對象很少,Foo中Bar對象的平均數目很接近到一)。 – pintoch

+0

我知道你錯了。我不質疑你對數據的知識,我只是給你我之前經歷的和這種方法的缺點。 既然你絕對需要這個,你可以使用自Django 1.9以來的JSONField。它接收一個Python對象並將其保存爲JSON,當它被檢索到時,再次將get解析爲Python。 –

+0

是的,這也是我在我的問題中提到的,我只是想知道是否存在更高級別的版本。顯然沒有,所以這就回答了這個問題。 :-) – pintoch