这个数据库是第三范式/ 3NF吗?

时间:2018-03-31 17:04:59

标签: sql database-normalization 3nf

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

The Database

2 个答案:

答案 0 :(得分:0)

简单回答否。谷歌传递依赖,甚至只是谷歌3NF?

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

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

还有一个地方不太清楚,但我很确定你打破3NF。在您的付款表中,您有存款付款,总价,仍需支付的金额和全额付款。有一个论点,给定总价和存款支付,你可以确定仍然支付的金额。有一个非常强烈的论据,你总是可以从其他三个“付费”栏中确定完全支付。

答案 1 :(得分:0)

  1. 您可以使用id,title,firstname,lastname
  2. 创建Person表
  3. 您可以将person_id添加到customerTable和employeeTable。并从该表中删除title,firstname,lastname字段。
  4. 您可以使用列ID,名称创建TownTable,然后将town_id添加到customerTable和emloyeeTable。删除表格
  5. 的列镇ftom
  6. 使用列id,contact_type_id,contact_info
  7. 创建contactInfoTable
  8. 将contact_info_id列添加到employeeTable和customerTable。从该表中删除有关联系信息(phoneNo,email)的其他列。
  9. 创建contactType表woth列id,name。使用姓名phone和email
  10. 向该表填充两行
  11. 使用列id,address,town_id
  12. 创建personAddress表
  13. 将personAddress_id添加到customerTable,employeeTable表。从表中移除地址,城镇
  14. 创建TownTable woth列id,名称
  15. 您可以使用列id,employee_id,username
  16. 创建userTable
  17. 您可以使用id和user_id
  18. 创建passwordTable
  19. 使用id,user_id,role_id
  20. 创建user_role表
  21. 创建role_table并添加id,name
  22. 还要为所有表添加create_date,end_date(Date),active(nvarchar2(1)或integer)。在您的选择中使用active = 1条件。