Mysql 基于类型的数据库设计

Mysql 基于类型的数据库设计,mysql,sql,database,database-design,join,Mysql,Sql,Database,Database Design,Join,我想评价(非常好,好,中等,差…)2个对象:学生和老师。哪种设计方案更好 解决方案1: 学生(学生ID、等级等) -----------------1-------好----- -----------------2------坏----- -----------------3--非常好----- 教师(教师身份、等级等) -----------------1--非常好----- -----------------2------坏----- -----------------3------坏--

我想评价(非常好,好,中等,差…)2个对象:学生和老师。哪种设计方案更好

解决方案1:

学生(学生ID、等级等)

-----------------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性能应该是您最不需要担心的问题。