规范化这个表?

时间:2010-03-29 21:58:49

标签: sql database-design mysql

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

我应该规范化书签表并将我拥有的标记列删除到单独的表中。我每个书签有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 Query示例。我希望有一些有效的东西,因为除了在每个关键字列上进行LIKE测试之外,我现在想不出任何合适的东西!

3 个答案:

答案 0 :(得分:4)

现在规划未来它们只是标签,但最终可能会带有构建在标签上的属性或属性。如果你单独存储它们会更简单,连接会将数据组合在一起。如果你只是在一个表中使用它们而你需要添加到这个表中它就变成了一场噩梦。通过使用自己的实体表进行设置来规范化数据。这就像是优秀的OOP,提前做更多的工作,但最终会带来好处:)。

答案 1 :(得分: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等不再是书签的属性,而标记成为书签的属性,这是标记的集合。

你可能实际上会编写更少的代码行,尽管你的处理方式会有所不同。

例如,首先,您将查找书签及其属性。然后,如果要获取书签的标签列表,您将对标签表执行另一个查询。你可能不打算在这方面进行搜索。

然后,您将遍历标记列表并对每个标记执行相同的处理,而不是为每个标记重复代码行。

但是,您将使用联接来查找标记的书签:

SELECT bookmarks.id, bookmarks.title
FROM tags
JOIN bookmarks ON bookmarks.id = tag.bookmark_id
WHERE tags.key_word = ?

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

答案 2 :(得分:0)

我会将它标准化。如果您不在每个书签上使用可提高某些性能的标签。这将为您提供更多的灵活性,例如放置Tagg-cloud thingy并只获取所有不同的标签。