非规范化数据是否始终包含在单个表中?

时间:2013-04-26 14:13:25

标签: mysql sql database relational-database database-normalization

对于作业,我创建了一个数据库驱动的Web应用程序。我必须通过以非规范化形式显示我的数据库,然后逐步对其进行标准化,解释在每个阶段所做的事情来表明我对规范化的理解。

第1至3阶段的规范化过程(这是我们必须去的)我没有理解。

我的数据库包含20多个表,我不知道我应该如何表示这是0NF。主要困难在于,正如我所理解的那样,0NF数据在一个表中。事实上,我没有看到任何方法,因为0NF没有主键,因此没有办法在其他表中引用数据。

我是否正确地思考这个?或者我可以在多个表中表示0NF数据,这将使这项任务变得更加容易,因为我没有100+列表。

3 个答案:

答案 0 :(得分:0)

0NF是单个表格 - 就像数据电子表格一样。你不会引用任何其他表,你只需重复一个表中的数据。

例如,想象一下消息传递系统:

Customer | Recipient | Message
Bob        John        Hello John
John       Bob         Hello
Bob        John        Have you got time to answer a question?
John       Bob         No way

我们没有包含要链接到的Person的表格,我们会在客户列和收件人列中重复BobJohn

答案 1 :(得分:0)

0NF数据可以出现在多个表中,每个表可能是0NF,但是一个表是最糟糕的表。

这很可能是你首先要完成自发解决方案的任务,所以你可以展示如何让它更好的过程。

答案 2 :(得分:0)

你的意思是“非标准化”而非“非标准化”。后者是当规范化的基表被其他值替换的其他值时,其值始终是orignals的连接。你需要从给你任何人的位置找出是否对齐,这里的非标准化形式是指你的第一次设计尝试,还是具体的“普遍关系”,这是所有这些的适当联合。 取消正常化。

每个基表和查询结果都会将一些谓词(由列参数化的语句)的行保存到一个真正的命题(语句)中。

  • SELECT * FROM EMP“员工[E]被命名为[N]并具有依赖[D]”
  • SELECT * FROM DEP“员工[E]为部门工作[D]”
  • 查询SELECT E, N FROM EMP
    对于某些D,“员工[E]被命名为[N]并具有依赖[D]”
    (“employee [E]被命名为[N]并且有一些依赖”)

SQL FROM创建一个临时表,您可以将其视为每个表T的每个列C都有TC列。对于内部JOIN s(即INNER,{{ 1}}和plain)这个临时表是一个交叉连接。它的谓词是连接表的谓词的AND。 CROSSON条件也会与谓词进行AND运算。 WHERE子句重命名临时列,因此没有“。”。 (尽管如果不存在歧义,SQL就会这样做。)

  • 查询SELECT
    “对于某些EMP.D,员工[EMP.E]被命名为[EMP.N]并具有依赖[EMP.D]” AND“员工[DEP.E]为部门工作[DEP.D]”
    (即“雇员[E]被命名为[N]并且有一些依赖并且为部门工作[D]”)

请注意,与哪些约束无关。 (包括SELECT EMP.E AS E, N, DEP.D AS D FROM EMP JOIN DEPUNIQUEPRIMARY KEY& FOREIGN KEY)。约束只是告诉你表格在它们将持有的值中受到限制。事实上,约束由谓词和可能出现的情况决定

如果你知道T1.C CHECK T2.C的情况总是存在于T1和C表的某些C列中。 T2然后你只需要=其中一个,SELECT。如果每个表中的每个列C始终相等,则AS C会执行相应的NATURAL JOIN=,而不必提及任何列。

(More re predicates & SQL.)

PS 数据库的单基本版本不是基础,其值为ASFULL){{1}单独的基础。首先,规范化不会处理OUTER s,因此您必须从任何JOIN结果中删除它们,或多或少地为您提供表格。其次,NULL通常不是关联的,即OUTER JOIN<> FULL JOIN,所以没有这样的东西是“超过两个表的”FULL JOIN“。第三,即使只有两个表,他们的FULL JOIN通常也不允许你重建它们的值。

PPS 没有“第0范式”。 “第一范式”有不同的用途。有时它只是意味着成为一种关系,有时它意味着它是一种没有关系价值属性的关系,它也经常被用于各种其他混淆/不可知的方式,这些方式实际上是关于良好设计的方面。