对于作业,我创建了一个数据库驱动的Web应用程序。我必须通过以非规范化形式显示我的数据库,然后逐步对其进行标准化,解释在每个阶段所做的事情来表明我对规范化的理解。
第1至3阶段的规范化过程(这是我们必须去的)我没有理解。
我的数据库包含20多个表,我不知道我应该如何表示这是0NF。主要困难在于,正如我所理解的那样,0NF数据在一个表中。事实上,我没有看到任何方法,因为0NF没有主键,因此没有办法在其他表中引用数据。
我是否正确地思考这个?或者我可以在多个表中表示0NF数据,这将使这项任务变得更加容易,因为我没有100+列表。
答案 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
的表格,我们会在客户列和收件人列中重复Bob
或John
。
答案 1 :(得分:0)
0NF数据可以出现在多个表中,每个表可能是0NF,但是一个表是最糟糕的表。
这很可能是你首先要完成自发解决方案的任务,所以你可以展示如何让它更好的过程。
答案 2 :(得分:0)
你的意思是“非标准化”而非“非标准化”。后者是当规范化的基表被其他值替换的其他值时,其值始终是orignals的连接。你需要从给你任何人的位置找出是否对齐,这里的非标准化形式是指你的第一次设计尝试,还是具体的“普遍关系”,这是所有这些的适当联合。 将取消正常化。
每个基表和查询结果都会将一些谓词(由列参数化的语句)的行保存到一个真正的命题(语句)中。
SELECT * FROM EMP
“员工[E]被命名为[N]并具有依赖[D]”SELECT * FROM DEP
“员工[E]为部门工作[D]”SELECT E, N FROM EMP
SQL FROM
创建一个临时表,您可以将其视为每个表T的每个列C都有TC列。对于内部JOIN
s(即INNER
,{{ 1}}和plain)这个临时表是一个交叉连接。它的谓词是连接表的谓词的AND。 CROSS
和ON
条件也会与谓词进行AND运算。 WHERE
子句重命名临时列,因此没有“。”。 (尽管如果不存在歧义,SQL就会这样做。)
SELECT
请注意,与哪些约束无关。 (包括SELECT EMP.E AS E, N, DEP.D AS D FROM EMP JOIN DEP
,UNIQUE
,PRIMARY KEY
& FOREIGN KEY
)。约束只是告诉你表格在它们将持有的值中受到限制。事实上,约束由谓词和可能出现的情况决定。
如果你知道T1.C CHECK
T2.C的情况总是存在于T1和C表的某些C列中。 T2然后你只需要=
其中一个,SELECT
。如果每个表中的每个列C始终相等,则AS C
会执行相应的NATURAL JOIN
和=
,而不必提及任何列。
PS 数据库的单基本版本不是基础,其值为AS
(FULL
){{1}单独的基础。首先,规范化不会处理OUTER
s,因此您必须从任何JOIN
结果中删除它们,或多或少地为您提供表格。其次,NULL
通常不是关联的,即OUTER JOIN
<> FULL JOIN
,所以没有这样的东西是“超过两个表的”FULL JOIN“。第三,即使只有两个表,他们的FULL JOIN通常也不允许你重建它们的值。
PPS 没有“第0范式”。 “第一范式”有不同的用途。有时它只是意味着成为一种关系,有时它意味着它是一种没有关系价值属性的关系,它也经常被用于各种其他混淆/不可知的方式,这些方式实际上是关于良好设计的方面。