0

对于一项任务,我创建了一个数据库驱动的 Web 应用程序。我必须通过以非规范化形式显示我的数据库,然后逐渐对其进行规范化,解释每个阶段所做的事情,来展示我对规范化的理解。

阶段 1 到 3 的规范化过程(这是我们必须要做的)我很容易理解。

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

我这样想对吗?或者我可以在多个表中表示 0NF 数据,这将使这项任务更容易,因为我不会有 100+ 列表。

4

3 回答 3

0

0NF 数据可以出现在多个表中,每个表都可能是 0NF,但一张表用于一切是最糟糕的形式。

这很可能是一个任务的情况,你首先必须先搞砸你的自发解决方案,这样你就可以展示如何让它变得更好的过程。

于 2013-04-26T14:20:41.733 回答
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

于 2013-04-26T14:17:43.093 回答
0

您的意思是“非规范化”而不是“非规范化”。后者是当规范化的基表被其他值始终是原始连接的其他表替换时。您需要从给您分配的人那里找出这里的非规范化形式是否意味着您的第一次设计尝试,或者特别是“通用关系”,它是所有这些的适当连接。那是去规范化。

每个基表和查询结果都包含使某些谓词(由列参数化的语句)成为真实命题(语句)的行。

  • 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。对于内部JOINs(即INNERCROSS普通),此临时表是交叉连接。它的谓词是联接表的谓词的 AND。ONWHERE条件也被 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的单独碱基的碱基。首先,规范化不处理NULLs,因此您必须从任何OUTER JOIN结果中删除它们,或多或少地将您的表格归还给您。其次,FULL JOIN通常不是关联的,即(T1 FULL JOIN T2) FULL JOIN T3<> T1 FULL JOIN (T2 JOIN T3),因此不存在“两个以上表的 FULL JOIN ”之类的东西。第三,即使只有两个表,它们的 FULL JOIN 通常也不允许您重建它们的值。

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

于 2015-09-20T02:30:30.083 回答