MySQL - 一个简单的数据库设计问题

5
假设我有一些“导师”,他们提供“在线网络课程”并创建“学习包”。学生可以对“在线网络课程”和“学习包”进行评分,最终一个导师的评分是他的“课程”和“包”上所有评分的简单平均值。
这是我们当前“评分”表的表结构 -
CREATE TABLE IF NOT EXISTS `Ratings` (
  `id_rating` int(10) unsigned NOT NULL auto_increment,
  `id_teacher` int(10) unsigned default NULL COMMENT 'the teacher who created the class/pack',
  `id_lp` int(10) unsigned default NULL  COMMENT 'the id of the learning pack',
  `id_wc` int(10) NOT NULL default '0' COMMENT 'the id of the webclass',
  `id_user` int(10) unsigned NOT NULL default '0' COMMENT 'the user who has rated',
  `rate` int(10) unsigned NOT NULL default '0',
  `cdate` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `udate` timestamp NULL default NULL,
  PRIMARY KEY  (`id_rating`),
  KEY `Ratings_FKIndex1` (`id_user`),
  KEY `id_lp` (`id_lp`),
  KEY `id_wc` (`id_wc`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

目前,班级评分和课程包评分都被输入到同一张表格中(id_wcid_lp被相应地输入 - 对于每个评分记录,一个被输入而另一个为NULL)。

所以,我的问题是 -
这种架构是否正确,还是最好将classpack评分保持分开?为什么或为什么不?我需要确切相同数量的Rating表字段用于classpack评分。

我猜,如果要单独找到班级和课程包评分,则单独的表格会减少要查找的记录数。但是,由于我们的情况仅需要导师评分(涉及班级和课程包),因此所有评分都放在一起。


使用MySQL Workbench,它甚至是由MySQL开发人员开发的。 - JamesM-SiteGen
3个回答

3

更加详细的模型说明:

  • 大学老师也可以上课。
  • 一个班级可以有多个老师。
  • 同一门课程可能有多个不同的老师教授不同的班级。
  • 只有参加课程的学生才能评价(投票)该课程。
  • 学习包是关于某一主题的(例如数学、生物等)。
  • 一个学习包可以有多个作者。
  • 从技术上讲,学生也可以成为学习包的作者。
  • 只有使用学习包的成员才有权对其进行评价。
  • 尽管作者可以为学习包投票,老师可以为他们的课程投票,但这些投票会被忽略。

alt text

如果只对评分表感兴趣,您可以使用以下内容:

alt text

或者,将两个模型组合成如下内容:

alt text


谢谢您用这些漂亮的图片回答我的问题,但是您能否稍微解释一下这种架构为什么更好呢?我只对评分表感兴趣,而且只关注我所描述的系统(即仅涉及导师、课程和套餐这些实体)。 - Sandeepan Nath

0
如果您认为您最终会有更多需要评分的实体,则需要创建更通用的东西(并且不太符合数据库哲学)。
ratings
-------
id
voterClass
voterId
subjectClass
subjectId
vote
date(s)

通过使用这种设计,您可以忘记外键和参照完整性。但它非常灵活,并且使用正确的索引非常可扩展。此外,当实体(主题)被删除时,投票仍然存在。这种设计可以避免重复字段和表。


0

@JamesM-SiteGen- 实际上我在这里询问了一个数据库设计的提示/想法。你建议的工具可能在一般情况下有所帮助,但我看不出它如何直接回答我的问题。你能详细说明一下吗?你可以考虑将此作为解决方案发布到https://dev59.com/qm445IYBdhLWcg3wwc2g问题中。 - Sandeepan Nath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接