2

我徒劳地试图学习如何使用对象数据库。在数据库教科书中,传统似乎是使用跟踪学生、课程和班级的例子,因为它是如此熟悉和适用。这个示例作为对象数据库会是什么样子?关系数据库看起来像

Student
  ID
  Name
  Address

Course
  ID
  Name
  PassingGrade

Class
  ID
  CourseID
  Name
  StartTime

StudentClass
  ID
  ClassID
  StudentID
  Grade

您是否会将 StudentClasses 保留在 Classes 中,而 Classes 又保留在 Course 中,然后将 Student 保留为顶级实体?

Student
  ID
  Name
  Address

Course
  ID
  Name
  Classes[]
    Name
    StartTime
    Students[]
      StudentID
4

3 回答 3

4

那么你有Courses, Students 和Classes,它们是Courses 的一部分并且被 s 访问过Student?如果你仔细想想,我认为这个问题会自行回答。如果您摆脱 MongoDB 的纯 JSON 并查看如何在 ODM(相当于 RDB 中的 ORM)中定义它,可能会更清楚,因为基于文档的 DB 并没有真正强制执行它们自己的模式(示例是基于MongoEngine为 Python开启):

class Student(Document):
    name = StringField(max_length=50)
    address = StringField()

class Attendance(EmbeddedDocument):
    student = ReferenceField(Student)
    grade = IntField(min_value=0, max_value=100)

class Class(EmbeddedDocument):
    name = StringField(max_length=100)
    start_time = DateTimeField()
    attendance_list = ListField(EmbeddedDocumentField(Attendance))

class Course(Document):
    name = StringField(max_length=100)
    classes = ListField(EmbeddedDocumentField(Class))

这将为您提供两个集合:一个用于Students,一个用于Courses。Attendance将嵌入到Classes 中,而Classes 将嵌入到Courses 中。像这样的东西(伪代码):

Student = {
    name: String,
    address: String
}

Course = {
    name: String,
    classes: {
        name: String,
        start_time: DateTime,
        attendance_list: {
            student: Student,
            grade: Integer
        }[]
    }[]
 }

您当然可以将成绩信息放在学生对象中,但最终您确实无能为力来摆脱额外的课程。

于 2010-03-11T20:34:00.117 回答
0

在纯 OODB 中,您的模型很好。

于 2010-03-01T01:32:32.747 回答
0

OODBMS 的全部意义在于允许您设计数据模型,就好像它只是在内存中一样。不要将其视为数据库架构问题,将其视为数据建模问题,假设您拥有大量 VM 和有限数量的物理内存,您要确保没有将大量页面错误(或者实际上是数据库 I/O 操作)煮沸,以执行重要的操作。

于 2010-03-01T02:14:02.240 回答