【问题标题】:Finding products based on multiple tags根据多个标签查找产品
【发布时间】:2020-10-24 10:11:42
【问题描述】:

我有以下格式的数据:

"products":
{
      "handle": "handle1",
      "tags": "t1, t2, t3, t4, t5"
}
{
      "handle": "handle2",
      "tags": "t1, t6, t7, t5"
}
:
:
100s of products with a unique handle and multiple tags

我希望创建一个数据库,使用它我可以根据多个标签过滤产品(例如,使用标签 t1 和 t6 获取所有产品句柄)。

这实际上是我在检索所有产品时获得的 Shopify 数据集。我可以使用 GraphQL API 来做到这一点,但现在将其设置在基于 FLASK 的大型应用程序上变得太混乱了。

此外,还有一个移动应用程序可以使用相同的后端 API 获取数据。因此,我们希望使用我们使用 REST API 检索的数据来执行此操作,然后使用它创建一个数据库。

对于我应该如何为这种情况设计数据库有什么建议吗? 提前感谢您的帮助。

PS - 我知道有一天可能会在 Shopify 中添加带有新标签甚至预先存在标签的新产品,在这种情况下我们将不得不再次更新数据库。目前的解决方案是定期运行 cron 作业以检查是否在 Shopify 中添加了我们的数据库中不存在的任何新产品(或标签),然后更新数据库(可以很容易地自动化)。

【问题讨论】:

    标签: mysql sql database shopify mysql-python


    【解决方案1】:

    您遇到的困难说明了why it's wrong to store a comma-separated list in a string,当您想要像列表中的项目是离散数据值一样进行查询时。

    您应该将标签存储在从属表中,每行一个标签。使用类似 JSON 的符号:

    "product_tags":
    [
      { "handle": "handle1", "tag": "t1" },
      { "handle": "handle1", "tag": "t2" },
      { "handle": "handle1", "tag": "t3" },
      { "handle": "handle1", "tag": "t4" },
      { "handle": "handle1", "tag": "t5" },
      { "handle": "handle1", "tag": "t5" },
      { "handle": "handle2", "tag": "t1" },
      { "handle": "handle2", "tag": "t6" },
      { "handle": "handle2", "tag": "t7" },
      { "handle": "handle2", "tag": "t5" }
    ]
    

    然后你可以使用基于 SQL 集合的操作来查找匹配的集合,而不是尝试使用字符串函数有困难。

    SELECT pt1.handle
    FROM product_tags AS pt1 INNER JOIN product_tags AS pt2 USING (handle)
    WHERE pt1.tag = 't1' AND pt2.tag = 't6' 
    

    或者这个替代方案:

    SELECT p.handle
    FROM product_tags AS p
    WHERE p.tag IN ('t1', 't6')
    GROUP BY p.handle
    HAVING COUNT(DISTINCT tag) = 2
    

    这也称为

    【讨论】:

      【解决方案2】:

      一个好的方法是将标签保存在不同的表中,最好不要将标签的id和标签名视为主键。

      这里有一个简单的解决方案link

      【讨论】:

      • 我们也可以这样做。但我猜比尔的答案只在一张桌子上就可以做到。
      • 如果只有一张表,产品名称会重复,不好。
      • 一个产品可以有多个标签。因此,在您的中间表中,我们将重复 product_id。
      • Bill Karwin 也提到“您应该将标签存储在从属表中”。重复 int 的 product_id 比重复 varchar 要好得多。
      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2017-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-10
      • 2018-03-26
      • 2022-01-09
      相关资源
      最近更新 更多