我有一个包含数百个属性的模型。属性可以是不同的类型(整数,字符串,上传文件,......)。我想从最重要的属性开始,逐步实现这个复杂的模型。我可以想到两个选择:
ForeignKey
我没有找到任何关于如何使用django处理具有大量属性的模型的建议。这两种方法的优点/缺点是什么?
答案 0 :(得分:4)
你绝对应该不将你的属性定义为ForeignKeys。每次需要完整模型时,数据库服务器都必须生成数百个JOINs
,因此会破坏您的性能。
如果几乎每次访问模型时都需要您的属性,则应将它们保存在同一模型中。如果没有,您可以制作单独的Properties
模型,并通过OneToOneField
将其链接到原始模型。
我个人有过这样的经历。我们必须建立一个酒店推荐引擎,然后我们使用Drupal。当Drupal将每个自定义属性存储在一个单独的MySQL表中时,我们很快意识到我们应该切换框架,因为每个查询都会破坏我们的生产服务器(20多个JOIN对MySQL来说是致命的)。顺便说一下,我们最终使用了基于ElasticSearch的自定义解决方案,可以很好地处理数百个字段。
更新:如果您有幸使用最新版本的PostgreSQL,您可以利用JSONField
存储将所有字段打包到单个模型字段中。但请注意,您必须自己实施验证方案。
答案 1 :(得分:2)
客户要求。
首先,我感受到你的痛苦并祝你万事如意!我想重申一下,如果你不应该首先考虑更改它,因为在单个对象上永远不需要数百个属性,它通常表明需要数组,继承或单独的类等。
展望未来,您需要大量使用values
和values_list
才能从数据库中返回实际需要的属性,因为性能将严重削弱。< / p>
由于您无法对模型执行任何操作,因此您应该尝试从设计方面解决性能问题。 single responsibility principle应该在您的网站中占据重要位置,这意味着您只需要从模型中返回一些值。这样,你选择的选项真的不会有什么不同,因为返回的内容将非常有限。
尽可能过滤,并谨慎使用。
答案 2 :(得分:0)
您可以将它们分组到几个单独的模型中,由OneToOneFields链接到主模型。这将“命名”您的数据,名称空间是“一个很棒的主意”。