2011-12-01 42 views
1

我需要在SQL中存儲消息數據。無法決定去哪裏。PostgreSQL + Django:用於多類型數據的SQL設計模式

有一個主類消息,說(簡化):

class Message(models.Model): 
    user_id = models.ForeignKey(User) 
    text = models.TextField() 

另外,有沿用此一個其它消息類。

class MmsMessage(Message): 
    imagedata = models.ForeignKey(ImageData) 

依此類推。這些其他消息類別當然可以有超過1個附加字段。

現在,我正在評估最佳(最快)設計模式來完成此項工作。 在大約25%的情況下,我不需要額外的字段,只需簡單的原始消息對象(Message.objects.all)。在其他情況下,我需要所有數據。其他字段可能不一定是可搜索的。儘管如此,這將是件好事。

我在想:

  • 答:繼承(具體,抽象)

    • 摘要繼承了。我失去了做這件事的能力:Message.objects.all()這是不可接受的。

    • 具體繼承在我看來就像是一條路。試過兩種方法。 django-model-utils一個(select_subclasses),它不需要額外的查詢,但是由於大量的內部連接和結果中的冗餘數據,與其他解決方案相比,它非常慢。 (使用contenttypes知道我們正在處理的內容,然後選擇相關的字段)比select_subclasses(至少在postgresql上)快4倍 - 這對我來說是一個小驚喜(使用contenttypes來知道我們正在處理的內容,然後選擇相關的字段)它需要+ n個查詢,其中n是一些子類型,但由於更簡單的連接和沒有不必要的數據結果,所以仍然更快)。通過20種不同的消息子類型對10 000個對象進行測試。

  • B:EAV模型(多對多的附加屬性)

    • 沒有測試過EAV模型,但我懷疑這將是不是繼承的解決方案更快。當我知道我想要的列名和類型時,看起來EAV模型失去了它的全部魅力。
  • [更新 - horse_with_no_name] B1:hstore - similiar有許多人EAV很多,但有可能要快得多(無連接,後臺支持)

    • 大加字典喜歡自定義字段。
    • 缺點:我失去了與其他django數據庫後端的兼容性(我不喜歡),它也是類型不可知的,鍵和值是TEXT。由於hstore dict中有許多TEXT字段,我也擔心消息表原始查詢的速度會變慢。
  • C:額外的數據

    • XML領域在信息表中顯示信息表XML領域的東西,感覺有點腥給我。如果我不需要這些附加字段(來自消息子類型)可被搜索或可索引 - XML字段是一個很好的解決方案嗎?

什麼是你認爲最好的選擇嗎?

+0

看看hstore擴展:http://www.postgresql.org/docs/current/static/hstore.html –

+0

感謝您的鏈接!看起來很有希望,甚至還有爲此提供體面支持的django-hstore項目。缺點 - 將來可能的目標數據庫Amazon RDS目前不支持PostgreSQL。編輯的問題。 – arkens

+0

這聽起來像一個文件數據庫,像沙發一樣的問題。如果這是應用程序的核心,我看不到關係開銷的好處。它可以輕鬆解決您的其他領域問題。 –

回答

1

這裏的簡單答案是隻使用一個表。然而,真正的問題是爲什麼你要把東西放在數據庫中。如果您的意圖是擴大到大尺寸,那麼您可能需要查看混合存儲模型(在數據庫中對消息進行索引並將原始消息存儲在hbase中)。

+0

與hstore和單表解決方案。爲什麼我們沒有像你所建議的那樣使用解決方案,我們的索引覆蓋了我們需要的大部分數據部分。如果原始消息比其索引要大得多,則混合存儲模型非常有用。 – arkens