首页 > 解决方案 > 哪种方法更适合在 Django 中进行标记?多对多还是 ArrayField?

问题描述

我正在 Django 中构建一个新项目。该项目包含UsersPaintings. 一个User拥有许多Paintings。我希望Users能够标记他们的Painting,然后能够使用标签对它们进行排序。

AUser需要能够同时搜索 n 个标签。此外,API 将返回与其查询兼容的标签。比如说,我有以下架构:

{
  "User#1": {
    ...
    "paintings": {
      "Mona Lisa": {
        "tags": ["Da Vinci", "Gioconda", "Portrait", "Color"]
      },
      "Ginevra de' Benci": {
        "tags": ["Da Vinci", "Portrait", "Color"]
      },
      "The Last Supper": {
        "tags": ["Da Vinci", "Landscape", "Color"]
      },
    }
  }
}

User想要获取所有带有“肖像”标签的Paintings,API 将首先返回兼容标签(“达芬奇”、“颜色”、“乔康达”),然后它会返回Paintings带有“肖像”的标签(“蒙娜Lista”,“Ginevra de' Benci”)。我想为用户提供一种直观的方式来编写长的标签查询。

我的问题是:什么更好?使用“标签”模型并将其Painting与具有多对多的模型相关联?或者在模型中添加一个“标签”ArrayField Painting

我问的是安全性、性能和资源使用情况。我不想让任何User人知道Painting其他人有什么,但我不希望他们永远等待得到他们的查询结果。我也不想用过多的冗余数据阻塞我的数据库,但我需要我的用户能够动态添加(和创建)新标签

标签: djangodatabaseoptimizationquery-optimizationdjango-orm

解决方案


推荐阅读