Mysql 基于类型的数据库设计
我想评价(非常好,好,中等,差…)2个对象:学生和老师。哪种设计方案更好 解决方案1: 学生(学生ID、等级等) -----------------1-------好----- -----------------2------坏----- -----------------3--非常好-----Mysql 基于类型的数据库设计,mysql,sql,database,database-design,join,Mysql,Sql,Database,Database Design,Join,我想评价(非常好,好,中等,差…)2个对象:学生和老师。哪种设计方案更好 解决方案1: 学生(学生ID、等级等) -----------------1-------好----- -----------------2------坏----- -----------------3--非常好----- 教师(教师身份、等级等) -----------------1--非常好----- -----------------2------坏----- -----------------3------坏--
教师(教师身份、等级等) -----------------1--非常好----- -----------------2------坏----- -----------------3------坏----- 解决方案2: 学生(StudentID、RatingTypeID等) -----------------1------------------2---------- -----------------2------------------1---------- -----------------3------------------3----------
教师(教师ID、分级类型ID等) -----------------1------------------1---------- -----------------2------------------1---------- -----------------3------------------3----------
额定类型(额定ID、额定说明等) -----------------很好--------- -----------------好的-------------- -----------------3-------------坏---------------
如果两者都不够好,你能给我一些建议吗?谢谢 解决方案2是这两种方案中最好的一种,但是如果您希望在应用程序的生命周期中拥有多张投票,您应该有一个表,用于确定投票的主题,另一个表用于存储投票:
Student:
id
name
class
...
Teacher:
id
name
subject
...
voterType
id
description (student or teacher)
contest:
id
description (ex: 1st Semester 2013)
contestVotes:
id
contestId
voterType (Teacher or Student)
voterId
ratingTypeId
在两个建议的解决方案中,我肯定会选择第二个,原因如下:
- 在涉及排序或聚合的情况下,将
存储为数字非常方便,在这种情况下,字符串几乎是无用的评级
- 将
列作为评级
强制执行一个约束,即评级类型的外键。评级ID
只能具有非常特定的集合中的值,具有非常特定的含义。此外,将来您还可以在评级
表中添加额外的列,为您的评级增加价值RatingType
至于改进建议,既然你问过,考虑使用这个。教师和学生显然都是
人
,在某种程度上具有共同的属性。我将创建一个Person
超类表,其中包含常见属性(即名字、姓氏、地址、电话等),然后将学生的主键
和教师的主键
也设置为Person
的外键
请注意,评级也是一个常见属性。因此,出现在
Persons
表中是很自然的。当然,除非教师和学生有不同类型的评分,否则在这种情况下,您必须执行两个不同的RatingType
表。谢谢您的回答。我对您的设计有一个问题:投票
表格。如果我想获取更多关于投票人的信息,我必须检查voterType
(教师或学生)并连接到相应的表(教师或学生)?我如何使用MySQL做到这一点?如果您想直接选择voterType=student的位置,您可以与student内部连接并从中获得。如果您想同时获得有关学生和教师的信息,可以对竞赛投票进行内部联接。voterID=student.id和竞赛投票。voterType=1(student),教师也是如此。这回答了你的问题吗?或者我错过了你想问的问题了吗?我的意思是我想获得关于contestvows.id=1
(例如)投票人的信息。当然,我不知道哪种类型的投票人,我只知道输入的一件事是contestVote ID
。这取决于您希望在学生/教师中获得什么信息。通常情况下,你想知道的是,在一个表格中,比如竞赛投票,你想知道有多少老师/学生投了票,投了什么。如果您想同时从不同的学生和教师表格中获取信息,您必须创建一种输出这两种信息的方式,这两种方式都是有意义的。谢谢您的回答。我有一个关于性能的问题:如果我选择解决方案2
,我必须使用join
(RatingType
&Teachers
或RatingType
和student
)来获取所有信息,因此如果RatingType
表包含很少的行,student
和Teachers
表很大,使用join
操作的成本性能很高?@JackCood在这种情况下,您必须先在student
和teacher
之间执行union
,然后使用RatingType
将结果连接起来。这就是我提出IS-A方法的原因,在大多数情况下,您只需将person
加入RatingType
。诚然,person
甚至更大,但是使用正确的索引
es性能应该是您最不需要担心的问题。