【问题标题】:Appending tags to a row in a MySQL db将标签附加到 MySQL 数据库中的一行
【发布时间】:2023-03-17 18:36:01
【问题描述】:

我通常是前端开发人员(HTML/CSS 等),但目前我正忙于一些后端开发以应对挑战。请记住,我只做这个后端的事情几个星期,所以我的术语/逻辑还处于起步阶段……放轻松;)

作为一个起点,我正在 PHP 和 MySQL 中构建一个东西,这样我就可以对我的黑胶唱片收藏进行分类。这是一个非常简单的表格,它采用艺术家、标题、标签等并将其存储到 MySQL 数据库中。我还想为每条记录实现标签,这样一首曲目可能会被标记为“House |时髦 |声乐”,而另一个将被标记为“dubstep |主持人 |贝斯之类的。

我不能将这些标签作为数组存储在 MySQL 中,所以我知道我需要将它们作为逗号分隔值插入,然后当我想在前端级别使用这些标签时,我需要拉CSV 从数据库中取出,EXPLODE 值并将每个元素显示为单独的列表元素。

那部分我明白。但是我该如何添加额外的标签呢?我似乎找不到明确的答案(也许我在寻找错误的东西?)但到目前为止,我所能解决的是我必须从数据库中获取“标签”的当前数据库值和将其存储为变量。从数据库中删除“标签”值,将新标签附加到变量,然后将新变量存储回数据库。

当然还有更简单的方法?

【问题讨论】:

  • so I understand that I need to insert them as a comma separated value 这是你最不想做的事情。您可以简单地将这些标签逐行存储在一个表中,然后为您的 PHP 代码获取所有这些标签。不应将这些标签(如 CSV)存储在一行中
  • 您能否向我们展示一些您尝试过的代码以及您遇到错误的确切位置。
  • Hanky Panky,谢谢!作为一个完整的新手来到这里,真正有帮助的是这些金块信息!
  • Suresh,我没有收到错误,也没有要显示的代码。我在询问更多关于将标签添加到已存储在数据库中的列表的过程。

标签: php mysql database tags


【解决方案1】:

您应该学习关系表和外键的概念。您最好将标签分解成自己的表格,如下所示:

专辑表

album_id  album_artist    album_title
---------------------------------------------------
1         Nirvana         In Utero
2         Noisia          Split the Atom

标签表

album_id  tag
--------------------------------------------------
1         Rock
1         Grunge
1         Alternative
2         Dubstep
2         Drum & Bass
2         Experimental

然后您可以使用 GROUP CONCAT 将它们重新加入逗号分隔的列表中

SELECT       a.album_artist
            ,a.album_title
            ,GROUP_CONCAT(b.tag) AS tags
FROM        Album a
JOIN        Tags b
USING       (album_id)
WHERE       album_id = xxx

结果:

album_artist    album_title       tags
---------------------------------------------------
Nirvana         In Utero          Rock, Grunge, Alternative
Noisia          Split the Atom    Dubstep, Drum & Bass, Experimental

您可以进一步将数据分解为艺术家表,其中album_artist 名称替换为艺术家表中的艺术家ID,标签名称被分隔到另一个表中,标签名称替换为tag_ids。 .

请注意,GROUP_CONCAT 是 MySQL 特有的……很确定 SQL SERVER 2005 及更高版本有类似的东西,但我不记得他们叫什么了。 USING (col_name) 也是 MySQL 特有的,它只是编写像 ON a.album_id = b.album_id 这样的 ON 子句的一种更简单的方法,并且只能在连接列具有相同名称时使用。我只是更喜欢USING 而不是ON,因为它更短并且使复杂的查询更具可读性。

https://en.wikipedia.org/wiki/Database_normalization

编辑 根据您的评论,如果您将标签拆分到自己的表格中,这就是它的样子。我又添加了 2 个条目以显示值重复 - 请注意 Rock、Dubstep 和 Experimental 的使用次数超过 1 次,但它们的文本值仅列出一次...

Album table:

album_id  album_artist        album_title
---------------------------------------------------
1     Nirvana                 In Utero
2     Noisia                  Split the Atom
3     Nero                    Welcome Reality
4     Pink Floyd              The Wall

Tags table:

tag_id    tag
--------------------------------------------------
1         Rock
2         Grunge
3         Alternative
4         Dubstep
5         Drum & Bass
6         Experimental

Album_Tags table:

album_id  tag_id
--------------------------------------------------
1         1
1         2
1         3
2         4
2         5
2         6
3         4
4         1
4         6

查询:

SELECT       a.album_artist
            ,a.album_title
            GROUP CONCAT(c.tag) AS tags
FROM        Album a
JOIN        Tags b
USING       (album_id)
JOIN        Album_Tags c
USING       (tag_id)
WHERE       album_id = xxx
ORDER BY    album_title ASC

结果:

album_artist  album_title         tags
---------------------------------------------------
Nirvana       In Utero            Rock, Grunge, Alternative
Noisia        Split the Atom      Dubstep, Drum & Bass, Experimental
Pink Floyd    The Wall            Rock, Experimental
Nero          Welcome Reality     Dubstep

【讨论】:

  • 了解规范化和数据库设计的 3 个通用方法:如果您将超过 1 条信息填充到列值中,那么您做错了。如果你发现你一遍又一遍地重复信息,那你就错了。如果您发现您的列大多为 NULL 或空值,那么您做错了。当然这些规则也有例外,但是为了正确的数据库存储,你不能用 excel 电子表格来思考......多对多关系不能这样工作
  • 感谢 WebChemist。这给了我一些很好的建议。对您的标签表示例只有一条评论。假设我在“摇滚”下有几张专辑,我会在链接到唯一“专辑 ID”的“标签”下多次分配摇滚吗?我猜这是正确的做法,而不是“将超过 1 条信息填充到列值中”?
  • 我会将标签重命名为album_tags,然后创建一个只有tag_id、tag_name 的标签表...所以在标签中说“Rock”的id 为3,在你会列出的album_tags 表中的任何地方值 3 而不是单词“Rock”。如果您将表列与外键链接,那么它会将 id 限制为仅另一个表中的值(确保您没有没有关联值的记录)。这也使更新变得轻而易举,因为如果您想将“摇滚”更改为“硬摇滚”,您只需更新 1 个标签条目,而不是每个专辑条目
  • 除了 Stack Overflow 上关于外键和关系表的大量信息外,还有一个专门的数据库堆栈交换 dba.stackexchange.com 我想你会发现它们在回答概念时更有帮助数据库设计问题,因为 SO 更多地关注特定的编码问题(并且没有显示代码通常会让你关闭,因为这不是一个真正的问题)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2017-12-17
  • 1970-01-01
  • 2021-10-03
相关资源
最近更新 更多