PostgreSQL + Django:用于多类型数据的SQL设计模式
我需要在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字段是一个很好的解决方案吗?
什么是你认为最好的选择吗?
这里的简单答案是只使用一个表。然而,真正的问题是为什么你要把东西放在数据库中。如果您的意图是扩大到大尺寸,那么您可能需要查看混合存储模型(在数据库中对消息进行索引并将原始消息存储在hbase中)。
与hstore和单表解决方案。为什么我们没有像你所建议的那样使用解决方案,我们的索引覆盖了我们需要的大部分数据部分。如果原始消息比其索引要大得多,则混合存储模型非常有用。 – arkens
看看hstore扩展:http://www.postgresql.org/docs/current/static/hstore.html –
感谢您的链接!看起来很有希望,甚至还有为此提供体面支持的django-hstore项目。缺点 - 将来可能的目标数据库Amazon RDS目前不支持PostgreSQL。编辑的问题。 – arkens
这听起来像一个文件数据库,像沙发一样的问题。如果这是应用程序的核心,我看不到关系开销的好处。它可以轻松解决您的其他领域问题。 –