在很大程度上,我理解第一、第二和第三范式。我只想澄清我在网上找到的一些标准化示例。第一个例子如下:
UNF
Supplier: supplier_id, supplier_name, prod_code, prod_desc, cost, markup, dept_cd
1NF:
Supplier: supplier_id, supplier_name
supplier_product: supplier_id, prod_code, prod_desc, cost, markup, dept_cd
2NF:
Supplier: supplier_id, supplier_name
supplier_product: supplier_id, prod_code
product: prod_code, prod_desc, cost, markup, dept_cd
3NF:
Supplier: supplier_id, supplier_name
Product: prod_code, prod_desc, dept_cd (FK), supplier_id (FK), cost, markup
dept: dept_cd, dept_name, aisle_no
来源:http://cs.mvnu.edu/twiki/bin/view/Main/Lab8DB2013
从 UNF 迁移到 1NF 时,我们是否只是将构成重复组的值以及原始实体的主键一起移动到新实体?在上面的示例中,产品和部门被视为重复组。因此,两者都被移动到第二个实体。
这也可以在以下示例中得到证明:
0NF
ORDER(order#, customer#, name, address, orderdate(product#, description, quantity, unitprice))
1NF
ORDER(order#, customer#, name, address, orderdate)
ORDER_LINE(order#, product#, description, quantity, unitprice)
2NF
ORDER(order#, customer#, name, address, orderdate)
ORDER_LINE(order#, product#, quantity)
PRODUCT(product#, description, unitprice)
3NF
ORDER(order#, customer#, orderdate)
CUSTOMER(customer#, name, address)
ORDER_LINE(order#, product#, quantity)
PRODUCT(product#, description, unitprice)
来源:http://www4.comp.polyu.edu.hk/~cstyng/data.98/tutorials/norm5.html
在这种情况下,只有产品被视为重复组,而不是客户。因此,客户属性保留在原始实体中。我的理解正确吗?
编辑:另一个示例
一家软件合同和咨询公司维护其员工当前参与的所有各种项目的详细信息。这些细节包括: 将此数据标准化为第三范式。
• 员工编号
• 员工姓名
• 出生日期
• 部门代码
• 部门名称
• 项目代码
• 项目描述
• 项目主管 假设以下情况并将该数据归一化为 3NF:
• 每个员工编号都是唯一的。
• 每个部门都有一个部门代码。
• 每个项目都有一个代码和主管。
• 每位员工可以从事一个或多个项目。
• 员工姓名不一定是唯一的。
• 项目代码、项目描述和项目主管是重复字段。
UNF
Employee Number, Employee Name, Date of Birth, Department Code, Department Name, Project Code, Project Description, Project Supervisor
1NF
Employee Number, Employee Name, Date of Birth, Department Code, Department Name
Employee Number, Project Code, Project Description, Project Supervisor
2NF
Employee Number, Employee Name, Date of Birth, Department Code, Department Name
Employee Number, Project Code,
Project Code, Project Description, Project Supervisor
3NF
EmployeeNumber,Employee Name, Date of Birth, *Department Code
Department Code, Department Name
Employee Number, Project Code
Project Code, Project Description, Project Supervisor
第一范式是关于消除嵌套表,即作为另一个表中的值出现的表。 (从技术上讲,它被定义为“消除以关系为域的关系属性”,但在常见的数据库术语中,这意味着嵌套表。)
通过将嵌套表提取到单独的顶级表中并添加引用它来自的行的外键,可以消除这些问题(正如您正确描述的那样)。
标准SQL不支持嵌套表,因此关系数据库必然采用第一范式。当数据从某种分层格式(例如 JSON 或 XML 文档或文档数据库)迁移到关系数据库时,就会发生 1NF 规范化。
嵌套记录的另一个(历史)术语是“重复组”。不幸的是这个术语经常被误解。它“不是”指的是常规“平面”表中的重复数据或重复的列名称。它指的是嵌套的记录集,就像 JSON 结构中的对象如何包含其他对象的数组一样。在直接转换为表格格式时,这将表示为嵌套表,但第一范式要求我们提取这些嵌入表。 不幸的是,从您的示例中不清楚嵌套表中出现哪些属性(如果有)。这些要么是不好的例子,要么丢失了一些必要的格式或信息。我猜第二个例子中的括号代表一个重复组,即每个订单记录可以包含多个产品记录。如果是这种情况,则显示的归一化是正确的。