我通常是一个前端开发人员(html/css等),但目前我的工作正陷入一些后端开发的挑战中。请记住,我只做了几个星期的后端工作,所以我的术语/逻辑还处于初级阶段…放轻松;)
作为一个起点,我正在用php和mysql构建一个东西,这样我就可以编目我的乙烯基收藏。这是一个非常简单的表单,包含艺术家、标题、标签等,并将其存储到mysql数据库中。我还想为每一张唱片加上标签,这样一首歌可能会被标记为“House Funky Voice”,而另一首会被标记为“Dubstep MC Bass”或类似的东西。
我不能在mysql中将这些标记作为数组存储,所以我知道我需要将它们作为逗号分隔值插入,然后当我想在前端处理这些标记时,我需要将csv从数据库中取出,分解该值并将每个元素显示为单独的列表元素。
那部分我明白。但是如何添加附加标记呢?我似乎找不到确切的答案(也许我找错了地方?)但到目前为止,我所能做的就是从数据库中获取“tags”的当前数据库值并将其存储为变量。从数据库中删除“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

您可以进一步将数据分解为艺术家表,在该表中,唱片集艺术家名称将替换为艺术家表中的艺术家ID,标记名称将分隔为另一个表,标记名称将替换为标记ID…
注意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
编辑
根据你的评论,下面是如果你把标签分解到它自己的表中会是什么样子。我又添加了两个条目来显示重复值-注意rock、dubstep和experive是如何被多次使用的,但是它们的文本值只列出了一次…
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

09-25 18:03
查看更多