【问题标题】:Normalise this Table?规范化这个表?
【发布时间】:2010-03-29 21:58:48
【问题描述】:

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

我是否应该规范化书签表并将我拥有的标签列删除到单独的表中。我每个书签有 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 测试之外,我目前想不出任何像样的东西!

【问题讨论】:

  • 如果您发布表格,人们可能会更容易理解您的意思,以及您可以做些什么。
  • 为什么人们似乎认为联接是一件坏事并且应该避免?

标签: sql database-design mysql


【解决方案1】:

现在就计划未来,它们只是标签,但它们最终可能会携带基于标签的属性或属性。如果您将它们分开存储,这会简单得多,连接会将数据放在一起。如果您只是在一个表中使用它们并且需要添加到该表中,那将成为一场噩梦。通过使用自己的实体表设置数据来规范化数据。这就像好的 OOP,前期工作要多得多,但最终会得到回报 :)。

【讨论】:

  • 我是将新表中的标签存储为列,还是只是一个标签列表,其中包含一个与书签相关的 id?
  • @Abs - 你想规范化表格,这样你就不想重复列,每个标签都是一行。
【解决方案2】:

我认为将标签规范化到它们自己的表中会导致代码行数减少,并且更容易允许扩展标签数量而无需重新访问代码。

这也让你更容易独立查询标签,作为一个组,例如确定十个最受欢迎的标签等。

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 = ?

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

【讨论】:

  • @Marcus,你将如何返回具有特定标签的书签?
  • @Abs,我已将其添加到我的答案中。
  • 啊,我明白了,太棒了。谢谢!我很难解决这个问题,因为我认为我会将每个书签标签存储为一行,但没有。它们将存储为每行一个。
【解决方案3】:

我会把它标准化。如果您不在每个书签上使用会提高性能的标签。这会给你一些更大的灵活性,例如穿上 Tagg-cloud 的东西,然后获取所有不同的标签。

【讨论】:

    猜你喜欢
    • 2017-04-03
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-08
    • 2017-06-23
    • 2011-02-06
    • 1970-01-01
    相关资源
    最近更新 更多