根据多个标签查找产品
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 电子邮件