2010-04-14 94 views
1

我有一個模型,說,項目。我想存儲任意數量的屬性,如標題,描述,release_date。我希望他們不只是字符串,但有python類型,所以字符串,布爾,日期時間等。在Django模型中的任意類型的數據

我在這裏有什麼選擇?帶有單獨名稱 - 值表的EAV模式將不起作用,因爲所有值都具有相同的數據庫類型。例如,JSONField可能可以提供幫助,但它不知道日期時間。另外我在看PickeField,它非常適合,但我對性能有點擔心。

回答

4

你有幾個選項,沒有一個很好。其中一些已經在Stack Overflow上討論過before

首先,如您所建議的那樣,您擁有entity-attribute-value設計模式。

  • 您可以添加數據庫類型檢查,方法是爲VARCHAR表和INT表中的一個以及一個用於BOOLEAN等的表。
  • EAV使選擇非常痛苦。您必須查詢多個表才能真正獲取對象,並且如果必須在查找中使用EAV表中的值,則隨着大小的增加,您將遇到性能問題。
  • 但是,通常情況下,EAV應該只用於非常稀疏的數據,而另一個選項根本無效。
  • 在PyPI上有一個Django包,但我沒有使用它。
  • 我已經看到,使用時絕對需要很大的靈活性

一個更好的方法這樣的做法是有一個表,其模式的變化和元數據表描述表中的一些相當大的規模商用產品。對於大多數項目具有大多數屬性的密集數據,這比EAV有很多優勢。這種方法有時稱爲動態表或動態行。

  • 插入,更新和刪除快得多,因爲一切都在1-2表
  • 類型檢查,並可能限制可以加入
  • 然而,這種方法留下了非常複雜的數據庫,也很難與
  • 工作我不知道Django會使用它的ORM與這種數據庫的任何方式,因爲您的模型將在飛行中改變。
  • 您正在使用ALTER TABLE即時更改您的數據庫。您最好非常小心您的交易

如果您不需要根據這些動態屬性執行查找,那麼一種好方法是將動態數據存儲在JSONField中,或者更好地將模式存儲在經過模式驗證的XMLField中。但是,如果您必須根據屬於您的JSON或XML的動態屬性進行查找,查找將會很痛苦。

最好的方法取決於您的數據稀疏程度以及您將如何查找該數據。另外,要問的一個很好的問題是,如果你絕對需要這種靈活性。我曾參與過一些我們決定需要EAV的項目,但自項目投入生產以來,屬性很少被添加,很少被刪除,所以我們得到了所有的缺點,而且沒有任何好處。