gpt4 book ai didi

algorithm - 如何实现标签系统

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:50 25 4
gpt4 key购买 nike

我想知道实现标签系统的最佳方法是什么,就像在 SO 上使用的那样。我一直在考虑这个,但我想不出一个好的可扩展解决方案。

我在考虑有一个基本的 3 表解决方案:有一个 tags 表、一个 articles 表和一个 tag_to_articles 表。

这是这个问题的最佳解决方案,还是有替代方案?使用这种方法,表格会在时间上变得非常大,而且我认为对于搜索这不是太有效。另一方面,查询是否快速执行并不那么重要。

最佳答案

我相信您会发现这篇博文很有趣:Tags: Database schemas

The Problem: You want to have a database schema where you can tag a bookmark (or a blog post or whatever) with as many tags as you want. Later then, you want to run queries to constrain the bookmarks to a union or intersection of tags. You also want to exclude (say: minus) some tags from the search result.

“MySQLicious”解决方案

在这个解决方案中,模式只有一个表,它是非规范化的。这种类型被称为“MySQLicious 解决方案”,因为 MySQLicious 将 del.icio.us 数据导入到具有这种结构的表中。

enter image description here enter image description here

交集 (AND)查询“search+webservice+semweb”:

SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags LIKE "%semweb%"

联盟(或)查询“search|webservice|semweb”:

SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
OR tags LIKE "%webservice%"
OR tags LIKE "%semweb%"

负号查询“search+webservice-semweb”

SELECT *
FROM `delicious`
WHERE tags LIKE "%search%"
AND tags LIKE "%webservice%"
AND tags NOT LIKE "%semweb%"

“天窗”解决方案

Scuttle将其数据组织在两个表中。 “scCategories”表是“标签”表,并且有一个指向“书签”表的外键。

enter image description here

交集 (AND)查询“bookmark+webservice+semweb”:

SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId
HAVING COUNT( b.bId )=3

首先,搜索所有书签-标签组合,其中标签为“bookmark”、“webservice”或“semweb”(c.category IN ('bookmark', 'webservice', 'semweb')),然后只搜索已搜索所有三个标签的书签被考虑在内 (HAVING COUNT(b.bId)=3)。

联盟(或)查询“bookmark|webservice|semweb”:只需省略 HAVING 子句,您就有了联合:

SELECT b.*
FROM scBookmarks b, scCategories c
WHERE c.bId = b.bId
AND (c.category IN ('bookmark', 'webservice', 'semweb'))
GROUP BY b.bId

减号(排除)查询“bookmark+webservice-semweb”,即:bookmark AND webservice AND NOT semweb。

SELECT b. *
FROM scBookmarks b, scCategories c
WHERE b.bId = c.bId
AND (c.category IN ('bookmark', 'webservice'))
AND b.bId NOT
IN (SELECT b.bId FROM scBookmarks b, scCategories c WHERE b.bId = c.bId AND c.category = 'semweb')
GROUP BY b.bId
HAVING COUNT( b.bId ) =2

省略 HAVING COUNT 会导致查询“bookmark|webservice-semweb”。


“毒素”溶液

Toxi想出了一个三表结构。通过“tagmap”表,书签和标签是 n 对 m 相关的。每个标签可以与不同的书签一起使用,反之亦然。这个 DB-schema 也被 wordpress 使用。查询与“天窗”解决方案中的查询完全相同。

enter image description here

交集 (AND)查询“bookmark+webservice+semweb”

SELECT b.*
FROM tagmap bt, bookmark b, tag t
WHERE bt.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND b.id = bt.bookmark_id
GROUP BY b.id
HAVING COUNT( b.id )=3

联盟(或)查询“bookmark|webservice|semweb”

SELECT b.*
FROM tagmap bt, bookmark b, tag t
WHERE bt.tag_id = t.tag_id
AND (t.name IN ('bookmark', 'webservice', 'semweb'))
AND b.id = bt.bookmark_id
GROUP BY b.id

减号(排除)查询“bookmark+webservice-semweb”,即:bookmark AND webservice AND NOT semweb。

SELECT b. *
FROM bookmark b, tagmap bt, tag t
WHERE b.id = bt.bookmark_id
AND bt.tag_id = t.tag_id
AND (t.name IN ('Programming', 'Algorithms'))
AND b.id NOT IN (SELECT b.id FROM bookmark b, tagmap bt, tag t WHERE b.id = bt.bookmark_id AND bt.tag_id = t.tag_id AND t.name = 'Python')
GROUP BY b.id
HAVING COUNT( b.id ) =2

省略 HAVING COUNT 会导致查询“bookmark|webservice-semweb”。

关于algorithm - 如何实现标签系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com