单行的多个值

时间:2015-02-05 19:36:16

标签: mysql sql database database-design

我的网站允许用户在帖子上附加多个标签(很像StackOverflow)。

将标签存储在一个列中是否更好,即:

发布表

+---------+--------------------+
| post_id |        tags        |
+---------+--------------------+
|       1 | first,second,third |
|       2 | first              |
|       3 | first,third        |
+---------+--------------------+

或者最好是创建一个单独的表来单独保存标签,即:

post_tags表

+---------+--------+
| post_id |  tag   |
+---------+--------+
|       1 | first  |
|       1 | second |
|       1 | third  |
|       2 | first  |
|       3 | first  |
|       3 | third  |
+---------+--------+

谢谢!

2 个答案:

答案 0 :(得分:0)

这是一个偏好问题,至少是我看待它的方式。

我们假设您选择 post_table

选项

您想要在网页中显示给定标记的帖子数量。为此,您需要使用LIKE进行查询(如果标记列具有更好的FULLTEXT索引,则需要MATCH AGAINST)。例如:

SELECT count(post_id) FROM post_table WHERE tags LIKE '%first%';

会给你带有&#34;第一个&#34;的帖子数量标签。 (感谢评论我意识到,如果各种标签中包含&#34;第一个&#34;单词,那么它会给你一个不正确的帖子标记&#34;首先&#34; < /强>)

如果您选择 post_tags

选项

您需要一个简单的查询:

SELECT count(post_id) FROM post_tags WHERE tag = 'first';

由于第一个选项可能导致从表中检索到错误的结果,因此第二个选项将是唯一可供选择的选项。

P.D。您还可以创建一个单独的&#34; tag_table&#34;为每个标签保存带有数字ID的标签,还有一个联合表&#34; post_rel_tags&#34;保存帖子的ID和标签的ID。这样就可以节省数据库中的空间,因为你只需处理数值来建立关系,但查询不会那么简单(实际上它们很简单,但是你提出的选项,他们更简单了)

答案 1 :(得分:0)

您的问题可以改写如下:是否更好地坚持第一范式(1NF)?

当查询1NF中的表时,可以通过键控搜索始终获得单个值。键控搜索在可用且相关时使用索引。这就是设计1NF的原因。

如果您不必搜索标签,那么请适合自己。但是为什么你会在这种情况下使用数据库呢?