向MySQL数据库中的一行添加标记


Appending tags to a row in a MySQL db

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

作为起点,我正在用PHP构建一个东西&MySQL这样我就可以整理我的黑胶唱片了。这是一个非常简单的表单,将艺术家,标题,标签等存储到MySQL数据库中。我还想为每个记录实现标签,因此一个轨道可能被标记为"House | funky | vocal",而另一个轨道将被标记为"dubstep | MC | Bass"或类似的东西。

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

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

肯定有更简单的方法吧?

您应该学习关系表和外键的概念。您最好将标签分解到它自己的表中,像这样:

专辑表

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