这个数据库是第三个正常form/3NF吗?

Is this database in third normal form/3NF?

我知道这对某些人来说可能是个愚蠢的问题,但我需要在 3NF 中拥有这个数据库,但我对规范化知之甚少,因为我们的老师没有讲过。有人可以就它是否在 3NF 中给我一个简单的是或否的答案,如果不是,请提出任何更改建议。谢谢

简单的答案没有。Google 传递依赖,甚至只是 Google 3NF?

为什么会这样?因为您有一些列依赖于同一 table 中的其他列,而这些列不是主键的一部分。

例如,在您的客户 Table 中,您有邮政编码和城镇,但两者之间存在关系,即如果没有巴黎城镇,就不可能有巴黎的邮政编码。这是非常弱的传递依赖,大多数数据库都会有这个而不考虑它是不好的做法,但我认为这足以打破 3NF。

还有一个地方不太清楚,但我很确定你打破了 3NF。在您的付款 Table 中,您有已支付的定金、总价、尚需支付的金额和全额支付。有一种观点认为,给定总价和已付定金,您可以确定尚需支付的金额。有一个非常有力的论据,您总是可以从其他三个 "paid" 列中确定完全支付。

  1. 您可以使用 id,title,firstname,last
  2. 创建 Person table
  3. 您可以将 person_id 添加到 customerTable 和 employeeTable。并从 table.
  4. 中删除 title,firstname,lastname 字段
  5. 您可以使用列 id、name 创建 TownTable,然后将 town_id 添加到 customerTable 和 emloyeeTable。从 tables
  6. 中删除列镇
  7. 使用列 id 创建 contactInfoTable,contact_type_id,contact_info
  8. 将 contact_info_id 列添加到 employeeTable 和 customerTable。从 tables.
  9. 中删除关于联系信息(phone否,电子邮件)的另一列
  10. 创建包含 id、name 列的 contactType table。用名称 phone 和电子邮件
  11. 向 table 填充两行
  12. 使用列 id、address、town_id
  13. 创建 personAddress table
  14. 将 personAddress_id 添加到 customerTable、employeeTable tables。从 tables
  15. 中删除地址、城镇
  16. 创建包含 ID、名称列的 TownTable
  17. 您可以使用列 id、employee_id、用户名
  18. 创建 userTable
  19. 您可以使用 id 和 user_id
  20. 创建 passwordTable
  21. 创建 user_role table id, user_id, role_id
  22. 创建 role_table 并添加 id,name

还要将 create_date、end_date(日期)、活动(nvarchar2(1) 或整数)添加到所有 table。并在您的选择中使用 active=1 条件。