您的意思是“非规范化”而不是“非规范化”。后者是当规范化的基表被其他值始终是原始连接的其他表替换时。您需要从给您分配的人那里找出这里的非规范化形式是否意味着您的第一次设计尝试,或者特别是“通用关系”,它是所有这些的适当连接。那将是去规范化。
每个基表和查询结果都包含使某些谓词(由列参数化的语句)成为真实命题(语句)的行。
SELECT * FROM EMP
“员工 [E] 被命名为 [N] 并且有依赖 [D]”
SELECT * FROM DEP
“员工 [E] 在部门 [D] 工作”
- 查询
SELECT E, N FROM EMP
一些 D,“员工 [E] 被命名为 [N] 并且有依赖 [D]”
(“员工 [E] 被命名为 [N] 并且有一些依赖”)
SQLFROM
创建一个临时表,您可以将其视为每个表 T 的每个列 C 都有列 TC。对于内部JOIN
s(即INNER
和CROSS
普通),此临时表是交叉连接。它的谓词是联接表的谓词的 AND。ON
和WHERE
条件也被 AND 到谓词中。该SELECT
子句重命名临时列,因此没有“.”。(尽管如果没有歧义,SQL 会隐含地做到这一点。)
- 查询
SELECT EMP.E AS E, N, DEP.D AS D FROM EMP JOIN DEP
“对于某些 EMP.D,员工 [EMP.E] 被命名为 [EMP.N] 并具有依赖 [EMP.D]”
和“员工 [DEP.E] 为部门 [DEP.D] 工作”
(即“员工 [E] 被命名为 [N] 并且有一些依赖并为部门 [D] 工作”)
请注意,持有什么约束并不重要。(包括UNIQUE
, PRIMARY KEY
, FOREIGN KEY
& CHECK
)。约束只是告诉你,表的值是有限的。事实上,约束是由谓词和可能出现的情况决定的。
如果您知道 T1.C =
T2.C 对于表 T1 和 T2 的某些列 C 总是如此,那么您只需要SELECT
其中一个,AS C
. 如果每个表中的每一列 C 总是相等的,那么在不必提及任何列的情况下进行NATURAL JOIN
适当=
的操作。AS
(更多的谓词和 SQL。)
PS数据库的单碱基版本不是其值为FULL
( OUTER
)JOIN
的单独碱基的碱基。首先,规范化不处理NULL
s,因此您必须从任何OUTER JOIN
结果中删除它们,或多或少地将您的表格归还给您。其次,FULL JOIN
通常不是关联的,即(T1 FULL JOIN T2) FULL JOIN T3
<> T1 FULL JOIN (T2 JOIN T3)
,因此不存在“两个以上表的 FULL JOIN ”之类的东西。第三,即使只有两个表,它们的 FULL JOIN 通常也不允许您重建它们的值。
PPS没有“第 0 范式”。“第一范式”有不同的用途。有时它只是意味着一个关系,有时它意味着一个没有关系值属性的关系,它也经常用于各种其他混淆/荒谬的方式,这些方式实际上是关于良好设计的各个方面。