【问题标题】:Working Through Normalization (3NF)通过规范化工作 (3NF)
【发布时间】:2014-09-23 16:52:24
【问题描述】:

我已经计划这个网站有一段时间了,几周前开始整理它,我会说事情进展得非常好,直到有一天我被介绍给规范化。我花了很长时间才弄清楚它是什么以及为什么需要它,但我认为我现在已经接近实现我的总体目标了。

所以场景是我有一个网站,成员可以加入并建立自己的报纸/博客并为其分配作者。该网站主要由members_tableauthors_tablenewspapers_tableposts_table 组成,我已经通过并标准化得到:

成员

+----+-----------+----------+-----------------+----------+----------+------------+------------+
| ID | FIRSTNAME | SURNAME  | EMAIL           | USERNAME | PASSWORD | AVATAR     | JOINED     |
+----+-----------+----------+-----------------+----------+----------+------------+------------+
| 01 | Brian     | Griffin  | brian@gmail.com | briang   | ***      | hdhs.jpg   | 2014-07-31 |
| 02 | Meg       | Griffin  | meg@gmail.com   | megg     | ***      |            | 2014-07-31 |
| 03 | Peter     | Griffin  | peter@gmail.com | peterg   | ***      | jaunsq.jpg | 2014-07-31 |
| 04 | Glen      | Quagmire | glen@gmail.com  | glen     | ***      |            | 2014-07-31 |
+----+-----------+----------+-----------------+----------+----------+------------+------------+

作者

+----+-----------+----------+-----------------+-------------------+---------+----------+---------+
| ID | FIRSTNAME | SURNAME  | EMAIL           | BIO ( REQUIRED )  | TWITTER | FACEBOOK | WEBSITE |
+----+-----------+----------+-----------------+-------------------+---------+----------+---------+
| 01 | Brian     | Griffin  | brian@gmail.com | About me...       | URL     |          | URL     |
| 02 | Meg       | Griffin  | meg@gmail.com   | About me...       | URL     |          |         |
| 03 | Peter     | Griffin  | peter@gmail.com | About me...       |         | URL      | URL     |
| 04 | Glen      | Quagmire | glen@gmail.com  | About me...       | URL     | URL      |         |
+----+-----------+----------+-----------------+-------------------+---------+----------+---------+

** 这里应该分解社交吗?如果有,怎么做?

Newspaper_Categories

+----+-------------------+
| ID | CATEGORY          |
+----+-------------------+
| 01 | Lifestyle         |
| 02 | Auto Mobiles      |
| 03 | Entertainment     |
| 04 | Food & Drink      |
| 05 | Internet          |
+----+-------------------+

报纸

+----+-----------------------+----------+---------+------------------+------------------+
| ID | NAME                  | CATEGORY | AVATAR  | BIO ( REQUIRED ) | OWNER ( MEMBER ) |
+----+-----------------------+----------+---------+------------------+------------------+
| 01 | Spooner Street Weekly | 01       | 311.jpg | About Us...      | 01               |
| 02 | A Dogs Life           | 01       |         | About Us...      | 01               |
| 03 | In The Kitchen        | 04       | js.jpg  | About Us...      | 02               |
+----+-----------------------+----------+---------+------------------+------------------+

所有者应该去这里还是在名为 Newspaper_Owners 的表中

社交

+----+-------------------+
| ID | TYPE              |
+----+-------------------+
| 01 | Facebook          |
| 02 | Twitter           |
| 03 | Google            |
| 04 | Flickr            |
| 05 | Youtube           |
+----+-------------------+

Newspaper_Socials

+----------+--------+------+
| NEWSAPER | SOCIAL | LINK |
+----------+--------+------+
| 01       | 01     | URL  |
| 01       | 02     | URL  |
| 01       | 05     | URL  |
| 01       | 01     | URL  |
| 02       | 02     | URL  |
| 02       | 04     | URL  |
| 03       | 01     | URL  |
+----------+--------+------+

Post_Categories

+-------------------+--------------------+
| ID | NEWSPAPER_ID | CATEGORY           |
+----+--------------+--------------------+
| 01 | 01           | Glens Girls        |
| 02 | 01           | In The Clam        |
| 03 | 01           | Peters Shenanigans |
| 04 | 02           | Martini Recipes    |
| 05 | 03           | Housewife Tips     |
+----+--------------+--------------------+

帖子

+----+----------+-------+---------+----------+------------+-------+
| ID | CATEGORY | TITLE | ARTICLE | FEATURED | ADDED      | VIEWS |
+----+----------+-------+---------+----------+------------+-------+
| 01 | 01       | Title | Article | 0        | 2014-07-31 | 200   |
| 02 | 01       | Title | Article | 0        | 2014-07-31 | 220   |
| 03 | 03       | Title | Article | 1        | 2014-07-31 | 232   |
| 04 | 05       | Title | Article | 0        | 2014-07-31 | 143   |
| 05 | 05       | Title | Article | 1        | 2014-07-31 | 311   |
+----+----------+-------+---------+----------+------------+-------+

Post_Photos

+---------+-----+--------------+------+
| POST_ID | ALT | PHOTOGRAPHER | LINK |
+---------+-----+--------------+------+
| 01      | Alt | John Smith   | URL  |
| 02      | Alt |              |      |
| 03      | Alt | Mike Jones   |      |
| 05      | Alt | Adam West    | URL  |
+---------+-----+--------------+------+

Post_Keywords

+---------+---------+
| POST_ID | KEYWORD |
+---------+---------+
| 01      | Keyword |
| 01      | Keyword |
| 01      | Keyword |
| 01      | Keyword |
| 02      | Keyword |
| 02      | Keyword |
| 03      | Keyword |
| 03      | Keyword |
| 03      | Keyword |
+---------+---------+

如果每个帖子只允许3个关键字,可以在Posts表的末尾添加吗?

Author_Posts

+-----------+---------+
| AUTHOR_ID | POST_ID |
+-----------+---------+
| 01        | 01      |
| 01        | 02      |
| 01        | 03      |
| 02        | 04      |
| 03        | 05      |
+-----------+---------+

谁能告诉我我是否在这个结构的正确路线上,并给我一些关于Primary KeysForeign Keys ???应该去哪里的指示?

【问题讨论】:

  • 是的。绝对朝着正确的方向前进。例如,(author_id,post_id) 是一个自然的复合键。它是该表上唯一的键,它应该是 PRIMARY。或者,您可以将其视为唯一键并具有代理主键(例如author_posts_id),但这只有在您必须在其他上下文中引用该表时才有意义 - 其中,在这种情况下,不太可能。同样,(post_id,keyword) 也应该是 PRIMARY
  • 谢谢@Strawberry!你认为facebook, twitter & website 应该存在于Authors 表上吗?我的意思是它们只与那个 author_id 相关?
  • 如果您使用表格前缀命名关键列,对您和我们都有帮助。即MembersID 而不仅仅是ID。您的结果在多表查询中也会更加清晰。

标签: mysql database database-design mysqli normalization


【解决方案1】:

“** 是否应该在此处分解社交?如果是,如何分解?”

是的,您已经有了社交表。 向 Socials 添加一个新的多对多用户表

【讨论】:

  • 哦,不抱歉,有 2 个社交 - 一个与报纸有关,另一个可能与作者有关​​
  • 如果我理解您的设计,我会将“链接”从 NewsPaper_Socials 移至 Social 表。 (如果 Authors 和 NewsPaper_Socials 都指向同一个社交链接,那就是……)您已经为 Newspaper_Socials 做了模式。如果它们指向不同的链接,则表结构将相同,它们在 Authors 和 NewsParer_Socials 中的 Id 将不同。如果我偏离目标,我可能需要澄清目的。
  • 嗯,一份报纸可能有一个专门的 facebook 页面/twitter 页面等(A Dogs Life = twitter.com/adogslife),而作者可能有自己的个人资料(Peter Griffin = twitter .com/petergriffin) - 所以他们总是会有所不同。但是再想一想,如果报纸是基于作者的(例如个人博客或投资组合网站),那么它们可能是相同的。我又遇到了一个小问题,哈哈
  • 你在正确的轨道上。我注意到 POST_PHOTOS 缺少 PHOTO 的想法。
猜你喜欢
  • 2011-04-25
  • 2016-01-01
  • 2012-03-31
  • 2010-12-15
  • 1970-01-01
  • 2014-09-22
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多