基于多个标记查找产品

cidc1ykv  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(343)

我有以下格式的数据:

"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数据集,我在检索所有产品时得到的。我可以用graphqlapi来实现这一点,但是在预先存在的基于flask的大型应用程序上设置它现在变得太麻烦了。
此外,还有一个移动应用程序可能使用相同的后端api获取数据。因此,我们希望使用restapi检索的数据来实现这一点,然后用它创建一个db。
对于如何为这种情况设计数据库有什么建议吗?事先谢谢你的帮助。
ps-我知道有一天可能会有人在shopify中添加一个带有新标签的新产品,甚至是已有标签的新产品,在这种情况下,我们必须再次更新db。目前的解决方案是定期运行cron作业,检查shopify中是否添加了数据库中不存在的新产品(或标签),然后更新数据库(可以很容易地实现自动化)。

tmb3ates

tmb3ates1#

您遇到的困难说明了当您要像列表中的项是离散数据值一样执行查询时,为什么在字符串中存储逗号分隔的列表是错误的。
您应该将标记存储在相关表中,每行一个标记。使用类似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

这也称为关系划分。

falq053o

falq053o2#

一个好的方法是将标记保存在不同的表中,而且最好不要将标记的id和标记名作为主键。
这里有一个简单的解决方案为您的案例链接

相关问题