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字段是一个很好的解决方案吗?

什么是你认为最好的选择吗?

+0

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

+0

感谢您的链接!看起来很有希望,甚至还有为此提供体面支持的django-hstore项目。缺点 - 将来可能的目标数据库Amazon RDS目前不支持PostgreSQL。编辑的问题。 – arkens

+0

这听起来像一个文件数据库,像沙发一样的问题。如果这是应用程序的核心,我看不到关系开销的好处。它可以轻松解决您的其他领域问题。 –

这里的简单答案是只使用一个表。然而,真正的问题是为什么你要把东西放在数据库中。如果您的意图是扩大到大尺寸,那么您可能需要查看混合存储模型(在数据库中对消息进行索引并将原始消息存储在hbase中)。

+0

与hstore和单表解决方案。为什么我们没有像你所建议的那样使用解决方案,我们的索引覆盖了我们需要的大部分数据部分。如果原始消息比其索引要大得多,则混合存储模型非常有用。 – arkens