如何构建数据库以避免表中出现重复



我正在做这个练习,我必须构建一个sql数据库(MySql(来存储教师提供的私人课程的信息。以下是规则:

  • 只有一周的时段是从周一到周五(15-19(
  • 每位教师可以教授一门或多门课程
  • 每门课程都可以由多名教师教授
  • 一个用户在选定的小时内只能预订一节课
  • 一位老师在选定的时间内只能预订一节课

这就是我实现它的方式:

USER(Name, Surname, Email (PK), Password)
TEACHER(Name, Surname, Email (PK), Password) 
COURSE(Title (PK))
SLOTTIME(Day (PK), Hour (PK))
TEACHES(EmailTeacher, TitleCourse) all attributes are PK, FK(EmailTeacher -> Teacher, TitleCourse -> Course)
BOOKING(EmailUser, EmailTeacher, TitleCourse, Day, Hour) all attributes are PK, FK((EmailUser -> User), 
(EmailTeacher, TitleCourse -> Teaches), (Day, Hour -> SlotTime))

这个解决方案给我带来了两个问题,或者至少是我发现的问题:

  1. 我可以让同一用户在同一天和同一时间向不同的老师和不同的课程预订
  2. 我可以让同一个用户在同一天和同一时间向同一位老师预订不同的课程

下面是一个例子:

BOOKING('raul@gmail.com', 'michael@gmail.com', 'Database I', 'Monday', 16) // FIRST INSERT
BOOKING('raul@gmail.com', 'anthony@gmail.com', 'Algorithms', 'Monday', 16) // DIFFERENT TEACHER AND COURSE
BOOKING('raul@gmail.com', 'michael@gmail.com', 'Database II', 'Monday', 16) // SAME TEACHER AND DIFFERENT COURSE

我想得到的是一个表,上面指出的规则得到了尊重,但我不知道如何实现它

我想说,您需要一个对教师和工作时间有唯一限制的教师预订表。这一限制将阻止教师一次预订超过一个小时。你是否希望它成为PK取决于你的偏好,我个人不喜欢复合约束(PK在语义上也是唯一约束,但唯一约束并不总是需要成为PK(。

BOOKING(EmailTeacher (PK), Day(PK), Hour(PK), TitleCourse) or 
BOOKING(ID (PK),  EmailTeacher, Day, Hour, TitleCourse)

使用此设置,我会将您的预订表重命名为SUBSCRIPTION,以便为两个不同的实体使用两个不同名称(并使有关它们的对话更容易(。Boooking应该与Subscription联系起来,也可以与老师或老师联系起来(这引发了一个哲学问题;(。

在SUBSCRIPTION表中,您需要对(user、day、hour(进行唯一约束,以防止用户预订同一时段的多个时段。

SUBSCRIPTION(EmailUser(PK), EmailTeacher(PK), Day(PK), Hour(PK)) or
SUBSCRIPTION(EmailUser(PK), BookingId(PK))

首先对逻辑设计进行排序,然后进入细节。

-- Teacher TCH exists.
--
teacher {TCH}
PK {TCH}
-- Course CRS exists.
--
course {CRS}
PK {CRS}
-- Time slot TIM exists.
--
slot {TIM}
PK {TIM}
-- Teacher TCH teaches course CRS.
--
teacher_course {TCH, CRS}
PK {TCH, CRS}
FK1 {TCH} REFERENCES teacher {TCH}
FK2 {CRS} REFERENCES course  {CRS}
-- Teacher TCH booked time slot TIM for course CRS.
--
teacher_slot_course {TCH, TIM, CRS}
PK {TCH, TIM}
SK {TCH, TIM, CRS}
FK1 {TCH, CRS} REFERENCES teacher_course {TCH, CRS}
FK2 {TIM} REFERENCES slot {TIM}
-- Student (user) USR exists.
--
user {USR}
PK {USR}
-- Student USR signed-up for course CRS.
--
user_course {USR, CRS}
PK {USR, CRS}
FK1 {USR} REFERENCES user    {USR}
FK2 {CRS} REFERENCES course  {CRS}
-- Student USR booked time slot TIM
-- for course CRS with teacher TCH.
--
user_slot_course_teacher {USR, TIM, CRS, TCH}
PK {USR, TIM}
FK1 {USR, CRS} REFERENCES
user_course {USR, CRS}
FK2 {TCH, TIM, CRS} REFERENCES
teacher_slot_course {TCH, TIM, CRS}

注:

All attributes (columns) NOT NULL
PK = Primary Key
AK = Alternate Key   (Unique)
SK = Proper Superkey (Unique)
FK = Foreign Key

最新更新