2013-04-04 16 views
1

比方说,我有一个MySQL数据库的三个表包含这样一些数据:数据表示

- Sections (which have a number, a title) 
- Sub-sections (which also have a number and a title but the title is the same as the title of the next data type with is 'statements') 
- Statements (which have a number, a title (the same as the title from Sub-sections) 

正如你可以在上面看到,现场冠军两个表小节陈述是相同的,他们有相同的数据。有没有更好的方法可以在我的表格中表示这一点,以便我不会有重复的数据?

感谢您的任何意见

+0

查找正常化http://databases.about.com/od/specificproducts/a/normalization.htm – Ashley 2013-04-04 20:24:49

回答

1

是的,你normalize表。

您只能使用两个表来完成此操作; sections和小节表格将仅使用一个表格Sections以及表示每个节段的父节段的新列ParentSectionNumber来表示,根节段将具有NULL作为父节段编号。事情是这样的:

Sections

  • SectionNumber
  • SectionTitle
  • ParentSectionNumber(可空)外键引用同一个表。

对于第二个表,我猜测,对于每个部分或子部分语句,在这种情况下创建引用表sections的外键:

Statements

  • StatementNumber
  • SectionNumber FOREIGN KEY参考Sections(SectionNumber)
1

任何冗余都可能导致数据损坏:如果有两条数据代表相同的信息,并且其中一条数据发生更改,您突然不知道哪条数据是正确的。实际上,你已经失去了信息!

这就是为什么正常化是重要的:它最大限度地减少冗余(和依赖)。

有时候,出于性能原因(所谓的“非规范化”)而故意进行冗余,但这通常是在衡量对性能的影响并仔细权衡数据损坏风险之后完成的。除非你这样做了,否则你的“默认”方法应该是避免数据模型中的冗余。

你没有解释你的数据模型应该什么意思,但我猜你需要这样的事:

enter image description here

注意,声明没有标题。您可以通过加入StatementSubSection得到声明的标题。

注意:如果您预计您需要少于或多于两个级别的部分,则可以通过Mahmoud Gamal的proposed表示通过“邻接列表”。对于一些其他的方式来表示分层数据,看看this presentation由Bill Karwin。