使用规范化会导致mysql查询错误

时间:2014-07-30 10:22:09

标签: php mysql sql database-design normalization

我正在尝试建立一个小型社区网站,人们可以在这里加入和发布新闻文章,博客,个人故事等,并且我在创建网站和大多数数据库表时都创建了正常化出现了。现在我对这个主题知之甚少,但过去几天都在研究这个问题,尽管我对它的理解有所改善,但我仍然可以看到它在某些情况下可能不相关,例如我的。

这里的情景 - 我的网站允许人们加入并发布他们自己的文章,他们可以通过为每篇文章提供个人或他们的博客来个性化他们的页面。因此,举例来说,我可以称其为其他人可能会说利兹生活的一类生活在英国,这完全取决于他们。

所以这是我的MySQL表:

+------+--------------------+------------------------+--------------------------+
| ID   | Category           | Title                  | Article                  |
+------+--------------------+------------------------+--------------------------+
| 01   | life-in-leeds      | Title For This Article | Text for this article... |
| 02   | life-in-leeds      | Title For This Article | Text for this article... |
| 03   | business           | Title For This Article | Text for this article... |
| 04   | professional-stuff | Title For This Article | Text for this article... |
+------+--------------------+------------------------+--------------------------+

因此有些人建议我有一个类别表,因为上表中的数据会重复出现。所以表格现在是:

+----+--------------------+
| ID | Category           |
+----+--------------------+
| 01 | life-in-leeds      |
| 02 | business           |
| 03 | professional-stuff |
+----+--------------------+

+------+----------+------------------------+--------------------------+
| ID   | Category | Title                  | Article                  |
+------+----------+------------------------+--------------------------+
| 01   | 01       | Title For This Article | Text for this article... |
| 02   | 01       | Title For This Article | Text for this article... |
| 03   | 02       | Title For This Article | Text for this article... |
| 04   | 03       | Title For This Article | Text for this article... |
+------+----------+------------------------+--------------------------+

因此,假设user_1拥有类别01&类别02,总共有10篇文章,其中5篇是01和01类。其他5个是02类。可以说他删除了这两个类别,所以现在它们都被设置为未分类,这导致查询时出现问题,即使它们都未分类,它们都有不同的ID,因此在搜索任何一个类别时,只会出现5个。因此,最好不要将其保留在原始表中,然后使用php更改它,例如,用$ new-category替换$ life-in-leeds,其中owner == $ owner_name?

1 个答案:

答案 0 :(得分:2)

规范化并不意味着“用id号替换文字”。

我们有像First Normal Form(1NF),Boyce-Codd Normal Form(BCNF)和Sixth Normal Form(6NF)这样的东西。我们没有任何类似“我用id号替换文本”的正常形式。那不是偶然的。

看看this example from Wikipedia。它从这个表开始,它在2NF。候选键是{Tournament,Year}。

Tournament Winners 

Tournament             Year    Winner           Winner Date of Birth
--
Indiana Invitational   1998    Al Fredrickson   21 July 1975
Cleveland Open         1999    Bob Albertson    28 September 1968
Des Moines Masters     1999    Al Fredrickson   21 July 1975
Indiana Invitational   1999    Chip Masterson   14 March 1977

本文展示了这种分解,旨在消除传递依赖Winner->Winner Date of Birth

Tournament Winners 

Tournament            Year   Winner
--
Indiana Invitational  1998   Al Fredrickson
Cleveland Open        1999   Bob Albertson
Des Moines Masters    1999   Al Fredrickson
Indiana Invitational  1999   Chip Masterson

Winner Dates of Birth 

Winner          Date of Birth
--
Chip Masterson  14 March 1977
Al Fredrickson  21 July 1975
Bob Albertson   28 September 1968

这两张桌现在至少5NF,对吗?这是重要的部分。

  • 原始表有四列。
  • 这两个决赛桌都没有四列。

为什么这很重要?删除依赖项始终会减少您开始使用的表中的列数。

如果你正在做的事情没有减少你开始的表中的列数,那就不是规范化了。它可能有用。这可能是明智的。但这不是正常化。

你的表以四列开头,最后有四列。它从一列确定了文章的类别开始,最后以一列确定了文章的类别。您开始使用的表格的正常形式和您结束的表格是相同的。就标准化而言,你的改变没有做任何事情。

话虽如此,规范化并不是设计数据库时唯一需要考虑的因素。您可以通过添加这样的表来提高数据完整性。

Categories

Category
--
life-in-leeds
business
professional-stuff

然后将一个外键从articles.category设置为categories.category。现在,您的数据库可以拒绝拼写错误的类别。另一方面,您现在必须有一个特殊的过程来向数据库添加新类别。