我需要在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字段是一個很好的解決方案嗎?
什麼是你認爲最好的選擇嗎?
看看hstore擴展:http://www.postgresql.org/docs/current/static/hstore.html –
感謝您的鏈接!看起來很有希望,甚至還有爲此提供體面支持的django-hstore項目。缺點 - 將來可能的目標數據庫Amazon RDS目前不支持PostgreSQL。編輯的問題。 – arkens
這聽起來像一個文件數據庫,像沙發一樣的問題。如果這是應用程序的核心,我看不到關係開銷的好處。它可以輕鬆解決您的其他領域問題。 –