2012-04-19 42 views
2

我正在看一些重要的论坛,如SMF论坛,PhpBB或VBulleting的,我意识到他们不在第三FN。为什么论坛数据库不在第三NF?

他们有很多NULL fiels,例如,在SMF论坛成员行可以有这一切栏为NULL:

pm_ignore_list, messageLabels, personalText, websiteTitle, websiteUrl, location, ICQ, AIM,YIM, MSN, timeFormat, userTitle, notifyAnnouncements, secretQuestion, secretAnswer, validation_code, additionalGroups, smileySet

所以......可以说,18个字段可以是在表的任何行中都为NULL。 这不是第三个NF ...

他们为什么这么做?我相信他们对BD非常了解...... 谢谢。

+1

为什么他们需要在这些空白字段中插入某些内容? – Hajo 2012-04-19 16:05:53

+0

3NF在非关键字段中不需要空值?根据比尔肯特:“[每一个]非钥匙[属性]必须提供一个事实关于钥匙,整个钥匙,除了钥匙。” null在这里。 – 2012-04-19 16:10:40

+1

@JonathanM:1NF不需要空值,这取决于您接受的1NF的定义。 – 2012-04-19 16:14:02

回答

6

非规范化的头号原因是性能,这是许多论坛的臭名昭着的问题。

最初,SQL的设计并不是为了容易地存储分层数据,并且有很多不太理想的模式设计试图解决这个限制。

+1

是的,我同意,我想添加一个例子。你想保留论坛的最后一张海报。您只需保留最后一张海报的ID即可轻松完成此操作,但如果您这样做,则需要在列出论坛或主题时再次加入。如果你想获得更多的性能,你只需将用户和ID的名称保存在现在冗余的论坛表中,但避免了额外的连接。 – 2012-04-19 16:10:23

+0

好吧,我明白了。谢谢RedFilter。所以这都是关于表演......那么,3FN并不总是擅长表演吗? – Alvaro 2012-04-19 16:20:59

+0

并不总是如此。 *“正常化,直到它伤害,反规范化,直到它工作”* – RedFilter 2012-04-19 16:30:59

1

其中一个或多个原因可能适用。

  • 该数据库根本不是“设计”的;它逐渐累积越来越多的列,因为任何编写它的程序员都决定添加一列。 (程序员通常只接受数据库设计方面的最低限度培训。)

  • “设计”,比如它,是委员会决定的结果。 (见上面)

  • “设计”被认为不是最好的主意,但是为了让软件能够运送而被实现。底层的幻想通常是在下一个版本之前正确地修复它。 (通常永远不会得到修复)

  • 该表已反规格化以提高SELECT性能。然而,根据我的经验,选择速度通常更多地受到以下因素的影响:a)过度使用身份证号码和b)误解正常化而不是高度正常化。