我正在查看一些重要的论坛,例如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个字段,这些字段在表的任何行中都可以为NULL。那不是第三个NF...
他们为什么这样做?我相信他们对BD了解很多...谢谢。
非规范化的首要原因是性能,这是许多论坛中臭名昭著的问题。
最初,SQL 并非设计为轻松存储分层数据,并且有许多不太理想的模式设计试图绕过此限制。
其中一个或多个原因可能适用。
-
数据库根本不是"设计"的;它逐渐积累了越来越多的列,因为任何从事它的程序员都决定添加一个。(程序员通常只接受过最低限度的数据库设计培训。
-
"设计"是委员会决定的结果。(见上文。
-
众所周知,"设计"不是最好的主意,但实施的目的是让软件发布。潜在的幻想通常是在下一个版本之前正确修复它。(通常永远不会得到修复。
-
该表已非规范化,以提高 SELECT 性能。不过,根据我的经验,SELECT 速度通常更多地受到 a) 过度使用 ID 号和 b) 误解归一化的影响,而不是高度归一化。