根据多个标签查找产品

Posted

技术标签:

【中文标题】根据多个标签查找产品【英文标题】: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 中添加了我们的数据库中不存在的任何新产品(或标签),然后更新数据库(可以很容易地自动化)。

【问题讨论】:

【参考方案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

这也称为relational-division。

【讨论】:

【参考方案2】:

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

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

【讨论】:

我们也可以这样做。但我猜比尔的答案只在一张桌子上就可以做到。 如果只有一张表,产品名称会重复,不好。 一个产品可以有多个标签。因此,在您的中间表中,我们将重复 product_id。 Bill Karwin 也提到“您应该将标签存储在从属表中”。重复 int 的 product_id 比重复 varchar 要好得多。

以上是关于根据多个标签查找产品的主要内容,如果未能解决你的问题,请参考以下文章

如何根据丝印查找相关的产品型号

根据 WooCommerce 订单商品产品标签更改 PayPal 电子邮件

如何让 mysql 与标签搜索一起获得平均评分?

企业微信标签和个人标签,是不是可以根据部门之间设置可见,如果有,请问是不是有提供对应api接口?

DOM选择器,即查找标签对象

在Excel中查找一个值,返回该值所在行或列的某个特定标签。