【问题标题】:Why forums database are not in 3rd NF?为什么论坛数据库不在 3rd NF 中?
【发布时间】:2012-04-19 16:04:25
【问题描述】:

我正在查看一些重要的论坛,例如 SMF 论坛、PhpBB 或 VBulleting 论坛,我意识到它们不在 3rd FN 中。

他们有许多 NULL 字段,例如,在 SMF 论坛中,成员行可以将所有这些列都设置为 NULL:

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

所以...假设 18 个字段在表的任何 ROW 中都可以为 NULL。 那不是第三个NF...

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

【问题讨论】:

  • 出于什么原因他们需要在这些空白字段中插入一些内容?
  • 3NF 要求非关键字段中没有空值? Per Bill Kent:“[每个] 非密钥 [属性] 必须提供关于密钥、整个密钥的事实,并且只提供密钥。” null 在此处执行此操作。
  • @JonathanM:1NF 不需要空值,这取决于您接受谁的 1NF 定义。
  • @Hajo,这些字段被认为是“可选”的。成员可以将它们设置为 NULL 或带有一些数据。 JonathanM, 3rd NF 在许多情况下避免空字段,这就是其中之一。如果你这样做,每个可选字段都会有很多表。

标签: php mysql sql database forum


【解决方案1】:

非规范化的首要原因是性能,这是许多论坛的一个臭名昭著的问题。

最初 SQL 的设计目的不是为了轻松存储分层数据,并且有许多不太理想的架构设计试图解决这个限制。

【讨论】:

  • 是的,我同意并且我想添加一个示例。你想保留论坛的最后一张海报。您可以通过仅保留最后一张海报的 ID 轻松做到这一点,但如果您这样做,则在列出论坛或主题时需要再加入一次。如果您想要更高的性能,您只需将用户名和 ID 一起保存在 forums 表中,这现在是多余的,但可以避免额外的加入。
  • 好的,我明白了。感谢红色过滤器。所以一切都与性能有关……那么,3FN 并不总是擅长性能,对吧?
  • 并非总是如此。 “正常化直到它受伤,非正常化直到它起作用”
【解决方案2】:

这些原因中的一个或多个可能适用。

  • 数据库根本不是“设计”的;随着任何从事它工作的程序员决定添加一个,它逐渐积累了越来越多的列。 (程序员通常只接受过最低限度的数据库设计培训。)

  • “设计”是委员会决定的结果。 (见上文。)

  • 众所周知,“设计”并不是最好的想法,但它是为了让软件发布而实施的。潜在的幻想通常是在下一个版本之前正确修复它。 (通常永远不会被修复。)

  • 为了更快的 SELECT 性能,对表进行了非规范化处理。不过,根据我的经验,SELECT 速度通常会受到 a) 过度使用 ID 号和 b) 对标准化的误解,而不是高度标准化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多