Sql 将表规范化为1NF

Sql 将表规范化为1NF,sql,database,database-design,normalization,Sql,Database,Database Design,Normalization,我正在努力将数据库分解为第一个正常形式 注:我已经将数据要求分解到UNF平面文件表中,我本打算将图片放在下面,但到目前为止,我的声誉还不超过10。然而,我将列出我的UNF代表 这些是数据要求 每个办公室都有一名经理(通常也是一名高级讲师)、几名高级讲师、讲师和行政人员。经理负责办公室的日常运作 客户必须首先在办公室登记,包括填写一份记录个人详细信息的申请表。在第一课之前,要求客户参加与讲师的面谈,以评估客户的需求,并确保客户持有有效的临时驾驶执照。客户可以在学习驾驶过程中的任何阶段自由要求特定

我正在努力将数据库分解为第一个正常形式

注:我已经将数据要求分解到UNF平面文件表中,我本打算将图片放在下面,但到目前为止,我的声誉还不超过10。然而,我将列出我的UNF代表

这些是数据要求

  • 每个办公室都有一名经理(通常也是一名高级讲师)、几名高级讲师、讲师和行政人员。经理负责办公室的日常运作
  • 客户必须首先在办公室登记,包括填写一份记录个人详细信息的申请表。在第一课之前,要求客户参加与讲师的面谈,以评估客户的需求,并确保客户持有有效的临时驾驶执照。客户可以在学习驾驶过程中的任何阶段自由要求特定的教员或要求更换教员。面试结束后,第一节课就被预订了。客户可以要求个别课程或以较低的费用预订一组课程
  • 每节课一小时,从办公室开始到结束。课程是在给定的时间,由特定的教练在特定的汽车上进行的。课程最早可于上午8:00开始,最晚可于晚上8:00开始。每堂课结束后,讲师记录客户的进度,并记录课程中使用的里程数
  • 这所学校有一批汽车,这些汽车是为教学目的改装的。每个教练都被分配到一辆特定的汽车上。除了教学外,教员还可以自由使用这些汽车供个人使用。每隔一段时间就要检查汽车是否有故障
  • 一旦准备就绪,客户将申请驾驶考试日期。要获得正式驾驶执照,客户必须通过驾驶考试和书面考试。讲师有责任确保客户为测试的各个方面做好了最好的准备。培训师不负责测试客户,测试期间不在车内,但应在测试前后在测试中心接送客户。如果客户未能通过测试,讲师必须记录失败的原因
驾驶学校联合国基金会的标准化代表:

OFFICE(
OfficeID,OfficeName,OfficeAddress,OfficePostcode,ManagerID,ManagerNAME,
ManagerTelephone,

[StaffID,StaffRole,StaffName,StaffSurname,StaffAddress,StaffPostcode,StaffSex,StaffD.O.B,
InstructorID,InstructorName,InstructorSurname,InstructorTelephone, CarID,CarRegistration,CarFaults,FaultDescription,

[ClientID,ClientName,ClientSurname,ClientAddress,ClientPostcode,ClientTelephone,ClientSex, 
InterviewID,Interviewer,ValidProvisional LessonID,LessonTime,LessonType,LessonPrice,LessonMileage,LessonProgress,
TestID,TestType,TestResult,Attempts,Failure Reason,Date Achieved]
) 

如果你想看UNF,我会给你发电子邮件

您需要以下表格:

ROLES
role_id
role_name

EMPLOYEES
employee_id
forename
surname
role  (fk, -> roles.role_id)
telephone 
gender
address
postcode
dob
如果你要有一个人的电话号码,那么考虑把它们存储在一个不同的表中;还要注意单个地址字段的问题。你不应该需要一个单独的教练桌;这些只是员工,他们的角色是讲师

OFFICES
office_id
office_name
address
manager (fk, -> employees.employee_id)

CLIENTS
client_id
forename
surname
address
postcode
telephone
gender
has_driving_license
interviewdate
interviewer   (fk, -> employees.employee_id)
我不认为你需要一个单独的面试表,只要每个客户只面试一次

CARS
license
description

LESSONS
lesson_id
curdate
client   (fk, -> clients.client_id)
instructor  (fk, -> employees.employee_id)
car      (fk, -> cars.license)
price
invoice
receipt

RESULTS
result_id
description

TESTS
test_id
client   (fk, -> clients.client_id)
curdate
result   (fk, -> results.result_id)
不需要“尝试”字段-您可以计算每个客户端的“测试”表中有多少条目,以了解每个客户端尝试测试的次数

我希望这足以让您开始使用数据库


编辑19/12/12:我添加了外键关系和新表RESULTS

我正在努力将数据库分解为第一个正常形式。
给您带来了什么麻烦?重复属性的整个概念我在StaffID中有StaffRole和StaffSex重复。经理名称出现在职员和讲师实体中。该类是否作为重复数据?因为在ManagerName、StaffName、InstructorName和Interviwer中出现了相同的名称。@MalphasWats:非常感谢,我只需要用这些练习开始一些地方,以便在涉及到真实事物时获得规范化的概念@布莱恩:你选择了一些相当复杂的东西来练习!至少,就所需的表的数量而言,这很复杂,但在其他方面相当简单。很抱歉问一下,为什么角色在它自己的表中?我现在正在设计ERD,是否可以对表之间的关系提供指导?@Bryan:关于角色,在多个记录中显示为值的任何文本字符串都应移动到单独的表中。这样,就限制了可用值的数量。换句话说,“员工”表中的“角色”字段将被限制为“经理”、“讲师”、“管理员”和“高级讲师”。您将无法输入拼写错误的值或新值,如“初级讲师”。