这个数据库是第三个正常form/3NF吗?
Is this database in third normal form/3NF?
我知道这对某些人来说可能是个愚蠢的问题,但我需要在 3NF 中拥有这个数据库,但我对规范化知之甚少,因为我们的老师没有讲过。有人可以就它是否在 3NF 中给我一个简单的是或否的答案,如果不是,请提出任何更改建议。谢谢
简单的答案没有。Google 传递依赖,甚至只是 Google 3NF?
为什么会这样?因为您有一些列依赖于同一 table 中的其他列,而这些列不是主键的一部分。
例如,在您的客户 Table 中,您有邮政编码和城镇,但两者之间存在关系,即如果没有巴黎城镇,就不可能有巴黎的邮政编码。这是非常弱的传递依赖,大多数数据库都会有这个而不考虑它是不好的做法,但我认为这足以打破 3NF。
还有一个地方不太清楚,但我很确定你打破了 3NF。在您的付款 Table 中,您有已支付的定金、总价、尚需支付的金额和全额支付。有一种观点认为,给定总价和已付定金,您可以确定尚需支付的金额。有一个非常有力的论据,您总是可以从其他三个 "paid" 列中确定完全支付。
- 您可以使用 id,title,firstname,last
创建 Person table
- 您可以将 person_id 添加到 customerTable 和 employeeTable。并从 table.
中删除 title,firstname,lastname 字段
- 您可以使用列 id、name 创建 TownTable,然后将 town_id 添加到 customerTable 和 emloyeeTable。从 tables
中删除列镇
- 使用列 id 创建 contactInfoTable,contact_type_id,contact_info
- 将 contact_info_id 列添加到 employeeTable 和 customerTable。从 tables.
中删除关于联系信息(phone否,电子邮件)的另一列
- 创建包含 id、name 列的 contactType table。用名称 phone 和电子邮件
向 table 填充两行
- 使用列 id、address、town_id
创建 personAddress table
- 将 personAddress_id 添加到 customerTable、employeeTable tables。从 tables
中删除地址、城镇
- 创建包含 ID、名称列的 TownTable
- 您可以使用列 id、employee_id、用户名
创建 userTable
- 您可以使用 id 和 user_id
创建 passwordTable
- 创建 user_role table id, user_id, role_id
- 创建 role_table 并添加 id,name
还要将 create_date、end_date(日期)、活动(nvarchar2(1) 或整数)添加到所有 table。并在您的选择中使用 active=1 条件。
我知道这对某些人来说可能是个愚蠢的问题,但我需要在 3NF 中拥有这个数据库,但我对规范化知之甚少,因为我们的老师没有讲过。有人可以就它是否在 3NF 中给我一个简单的是或否的答案,如果不是,请提出任何更改建议。谢谢
简单的答案没有。Google 传递依赖,甚至只是 Google 3NF?
为什么会这样?因为您有一些列依赖于同一 table 中的其他列,而这些列不是主键的一部分。
例如,在您的客户 Table 中,您有邮政编码和城镇,但两者之间存在关系,即如果没有巴黎城镇,就不可能有巴黎的邮政编码。这是非常弱的传递依赖,大多数数据库都会有这个而不考虑它是不好的做法,但我认为这足以打破 3NF。
还有一个地方不太清楚,但我很确定你打破了 3NF。在您的付款 Table 中,您有已支付的定金、总价、尚需支付的金额和全额支付。有一种观点认为,给定总价和已付定金,您可以确定尚需支付的金额。有一个非常有力的论据,您总是可以从其他三个 "paid" 列中确定完全支付。
- 您可以使用 id,title,firstname,last 创建 Person table
- 您可以将 person_id 添加到 customerTable 和 employeeTable。并从 table. 中删除 title,firstname,lastname 字段
- 您可以使用列 id、name 创建 TownTable,然后将 town_id 添加到 customerTable 和 emloyeeTable。从 tables 中删除列镇
- 使用列 id 创建 contactInfoTable,contact_type_id,contact_info
- 将 contact_info_id 列添加到 employeeTable 和 customerTable。从 tables. 中删除关于联系信息(phone否,电子邮件)的另一列
- 创建包含 id、name 列的 contactType table。用名称 phone 和电子邮件 向 table 填充两行
- 使用列 id、address、town_id 创建 personAddress table
- 将 personAddress_id 添加到 customerTable、employeeTable tables。从 tables 中删除地址、城镇
- 创建包含 ID、名称列的 TownTable
- 您可以使用列 id、employee_id、用户名 创建 userTable
- 您可以使用 id 和 user_id 创建 passwordTable
- 创建 user_role table id, user_id, role_id
- 创建 role_table 并添加 id,name
还要将 create_date、end_date(日期)、活动(nvarchar2(1) 或整数)添加到所有 table。并在您的选择中使用 active=1 条件。