需要有关MySQL表关系设计的帮助

时间:2011-06-12 14:22:38

标签: mysql

我正在为我的朋友创建一个网络应用程序,这是一个导师学校系统。现在,我在设计用于存储教师记录的表时遇到了问题。这是场景......

1。我们必须先创建课程2。然后我们将老师添加到课程中(假设我们已经将教师记录存储在教师表中),每个课程可以有多个教师,每个教师可以教授多个课程。每次老师来教,我们都会记录。每位教师不止一次教授一门课程。到月底,我们将所有教学记录拉出来并计算我们必须支付的款项

这是我目前的表格

// Course Table
course_id (PK)
...
...

// Teacher Table
teacher_id (PK)
...
...

// Course_teacher
course_id (FK: course.course_id)
teacher_id (FK: teacher.teacher_id)

问题是我无法向course_teacher表添加费用,因为我在第一时间将老师添加到本课程中,还没有教学。如果我在此表中添加“费用”和“日期”列,则数据将类似于......

1,1,null,null(这条记录在课程开始前添加,我不喜欢有空字段)
1,1,50,2011-06-12(这个老师在教学时第一次加入记录)
1,150,2011-06-19(这个记录第二次加入教师教学)
... 这样的表

//Teaching_fee
course_id (FK: course.course_id)
teacher_id (FK: teacher.teacher_id)
fee
paid_status
date

如果我这样做,1。 course_teacher将保留与课程相关的教师信息。 teaching_fee将保留教学费用的信息

它应该有效。但是,我脑海中的一些事情告诉我这是不对的。即使他们的创作目的不同,这两张桌子也是相似的。

有什么建议吗?

修改1 : 刚想出一个主意。如果这样做会怎么样

//Course_teacher Table
id (PK)
course_id (FK: course.course_id)
teacher_id (FK: teacher.teacher_id)

//Teaching_fee Table
id (FK: course_teacher.id)
fee
paid_status
date

最终解决方案: 我决定做 btreat 建议

// Course Table
course_id (PK)
...
...

// Teacher Table
teacher_id (PK)
...
...

// Course Teacher Table
course_teacher_id (PK) // synthetic
teacher_id (FK)
course_id (FK)
...
...

// Teacher Fee Table
course_teacher_id (PK)
date_paid (PK)
fee
paid_status
...
...

2 个答案:

答案 0 :(得分:1)

这可能更正常。

TABLE RateCards UID 费用 paid_status 日期

TABLE Teacher_RateCards UID RateCardId TeacherId

答案 1 :(得分:1)

如果你使用'teaching_fee'表而不是'course_teacher',只要应用程序中的业务逻辑知道如何解释null(即费用没有),我就不会担心收费的空值但已付款)。

但是,根据您的描述,这听起来像是每次教师获得课程报酬的记录,而且需要保留付款的日期?如果是这种情况,您肯定需要一个'teaching_fee'表,其中teacher_id,course_id和date_paid的组合形成一个唯一键。如果单独,您需要知道所有独特的教师/课程组合,您可以查询'teaching_fee'表。但是,如果教师/课程组合没有在'teaching_fee'中创建,直到教师付款,那么拥有一个单独的'course_teacher'表就可以了。

为避免您对非正规化(重复)课程/教师组合的不满,另一种选择是如下构建您的表格:

// Course Table
course_id (PK)
...
...

// Teacher Table
teacher_id (PK)
...
...

// Course Teacher Table
course_teacher_id (PK) // synthetic
teacher_id (FK)
course_id (FK)
...
...

// Teacher Fee Table
course_teacher_id (PK)
date_paid (PK)
fee
paid_status
...
...