我的网站允许用户在帖子上附加多个标签(很像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 |
+---------+--------+
谢谢!
答案 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的原因。
如果您不必搜索标签,那么请适合自己。但是为什么你会在这种情况下使用数据库呢?