规范化这个表格?

3

我正在创建一个社交书签应用程序。在开发过程中,我重新思考了数据库设计。

我是否应该将书签表规范化,并将标签列移动到单独的表中?每个书签有10个标签,因此每个记录(每个书签)有10个列。

对我来说,将表分成两部分似乎只会意味着我需要进行连接,但是当前的方式是直接选择,但是这个表感觉不太对......?

谢谢大家

更新

当前表结构:

CREATE TABLE IF NOT EXISTS `bookmarks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` char(250) NOT NULL,
  `link` text NOT NULL,
  `keyword_1` char(250) NOT NULL,
  `keyword_2` char(250) NOT NULL,
  `keyword_3` char(250) NOT NULL,
  `keyword_4` char(250) NOT NULL,
  `keyword_5` char(250) NOT NULL,
  `keyword_6` char(250) NOT NULL,
  `keyword_7` char(250) NOT NULL,
  `keyword_8` char(250) NOT NULL,
  `keyword_9` char(250) NOT NULL,
  `keyword_10` char(250) NOT NULL,
  `date_added` datetime NOT NULL,
  `privacy_type` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=68 ;

补充一点,收藏夹属于用户,标签属于收藏夹。因此我应该将 user_id 添加到 tags 表中吗?

一个相关的新问题:

如何搜索标签并返回收藏夹?

很高兴看到 SQL 查询示例。我希望能得到一些高效的东西,因为我目前除了在每个关键字列上进行 LIKE 测试之外,想不到更好的方法!


1
如果您发布表格,人们可能更容易看到您的意思以及您可以采取的措施。 - Frederik Wordenskjold
为什么人们似乎认为连接是一件坏事,并需要避免使用? - HLGEM
3个回答

4

现在它们只是标签,但它们可能最终承载属性或属性,这些属性或属性建立在标签之上。如果您将它们分开存储,这将变得更加简单,连接将数据合并在一起。如果您只在一个表中使用它们,并且需要向此表添加内容,则会变成一场噩梦。通过设置自己的实体表来规范化数据。就像良好的OOP一样,前期工作量更大,但最终会产生回报:)。


我应该将标签存储为新表中的列,还是仅作为标签列表,并带有与书签关联的 ID? - Abs
1
@Abs - 你想对表格进行规范化,因此你不希望出现重复的列,每个标签都应该是一行。 - JonH

3
我认为将标签归入它们自己的表中可以减少代码行数,并且更容易扩展标签数量,而无需重新编写代码。
这也使您能够更轻松地独立查询标签,例如确定十个最流行的标签等。
SELECT key_word, count(bookmark_id) AS tag_frequency
FROM tags
GROUP BY key_word
ORDER BY count(bookmark_id) DESC LIMIT 10

从面向对象的角度来看,将标签规范化到它们自己的表中意味着tag1、tag2等不再是bookmark的属性,而是成为bookmark的一个包含tag的属性集合。
虽然你会以稍微不同的方式处理事情,但实际上你可能会写更少的代码行数。
例如,首先,你会查找bookmark及其属性。然后,如果你想获取bookmark的标签列表,你将对标签表执行另一个查询。在这个方向上,你可能不会进行联接操作。
然后,你只需要遍历标签列表,并对每个标签执行相同的处理,而不是针对每个标签重复编写代码。
但是,你将使用联接来查找标签的书签:
SELECT bookmarks.id, bookmarks.title
FROM tags
JOIN bookmarks ON bookmarks.id = tag.bookmark_id
WHERE tags.key_word = ?

当然,这可能会返回多条记录。

@Marcus,你如何返回具有特定标签的书签? - Abs
@Abs,我已经将其添加到我的答案中。 - Marcus Adams
啊,我明白了,太棒了。谢谢!我之前遇到了一些困难,因为我以为每个书签标签都会存储在一行中,但实际上不是这样的。它们将被存储为每行一个。 - Abs

0

我会对其进行规范化处理。如果您不在每个书签上使用标签,那么这将提高一些性能。这将为您提供更多的灵活性,例如放置一个标签云,并只获取所有不同的标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接