如何以面向对象的方式对此进行建模

问题描述

|| 我的系统中有以下实体
public class Student
    {
        public Guid StudentId { set; get; }
        public string StudentName { set; get; }
        public virtual Course[] Courses { set; get; }
    }

 public class Teacher
    {
        public Guid TeacherId { get; set; }
        public string TeacherName { get; set; }
        public virtual Course[] Courses { get; set; }
    }


public class Course
    {
        public Guid CourseId { set; get; }
        public string CourseName { set; get; }
        public Student[] Students { set; get; }
        public Teacher Teacher { get; set; } 
        public Test[] Tests{ get; set;}
    }


public class Test
    {
        public Guid TestId { get; set; }
        public String TestName { get; set; }
        public int TotalMarks { get; set; }
        public int PassingMarks { get; set; }
    }
每个学生可以订阅许多课程,每个课程可以有很多学生 每位老师可以教多门课程,每门课程可以有一位老师 每个课程可以有许多测试 例如,有一门名为“数学”的课程,该课程持续6个月,在这6个月中进行了几次测试 如果我要存储以下数据“对于测试t1的学生S1标记” \“对于测试t2的学生s1标记”,正确的数据结构将是什么? 我知道我可以在考试和学生之间建立多对多的关系, 但是学生与课程之间已经存在多对多的关系,并且课程包含测试。     

解决方法

您应该考虑开设一个类,例如\“ Marks \”,其中包含关系Student-> Mark and Mark-> Test。 通常,当您进行面向对象的设计时,在此领域级别,您的类和关系是用例或描述中的名词和动词。在这种情况下,您知道您的学生有分数;这些是特定于学生的。学生没有考试,因为这些考试不是由学生创建或控制的。 更新资料 是的,您的想法是您拥有一门Mark,并且在Student和他们的Mark之间有联系;商标将与其测试有关系。换句话说,“一个学生有一个考试的分数”-一旦您学会了正确看待这些事情,实际上就是问题的语言。 所以那就像
class Student { // lots of other fields
    marks : set of Marks  // any convenient structure
                          // logically a Set because you wouldn\'t have the
                          // same marks assigned to a student twice
}

class Marks {  // A Mark is the Student\'s score for a test
    Score s;
    Test t;
    Student stud; // see below
}

class Test { // other information needed here too
    marks : set of Marks
}
现在,您有了一个类结构,可以让您问“学生在考试中的分数是多少?”,然后您可以问“那些考试是什么?”,反之,您可以问“ “这些测试分别给了什么分数?”和“那些学生是谁?”,这就是为什么马克需要与学生保持联系的原因。 有两件事要注意: (1)这是面向对象分析中非常常见的模式-许多关系变成代表它的“帮助类”。 (2)如果您打算将其放入数据库中,则存在第二个问题:自然的事情是使每个类成为一个单独的表。如果您可以以几乎为零的成本(例如访问时间)查找表中的项目,则此方案效果很好。在真实的数据库中,您必须多次访问磁盘才能进行此访问,并且访问速度变慢。这就是所谓的“对象关系阻抗失配问题”。有许多解决方案,包括对数据库进行规范化,创建额外的索引或视图以预先计算关系或修改对象模型。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...