我通常是一个前端开发人员(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