设计文档数据库模式

时间:2010-03-01 00:59:39

标签: couchdb mongodb relational-database object-oriented-database

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

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 个答案:

答案 0 :(得分:3)

所以你有Course s,StudentClass es,它们是Course的一部分并由Student s访问过?如果你考虑一下,我认为这个问题会自行解决。如果你离开MongoDB的纯JSON并且看看如何在ODM中定义它(相当于RDB中的ORM)可能会更清楚,因为基于文档的DB并没有真正强制自己的模式(例如基于on MongoEngine for 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))

这将为您提供两个集合:一个用于Student,一个用于CourseAttendance将嵌入ClassClass将嵌入Course es。Student = { name: String, address: String } Course = { name: String, classes: { name: String, start_time: DateTime, attendance_list: { student: Student, grade: Integer }[] }[] } 。像这样的东西(伪代码):

{{1}}

你当然可以将成绩信息放在学生对象中,但最终你没有太多可以去除额外的课程。

答案 1 :(得分:0)

在纯粹的OODB中,你的模型很好。

答案 2 :(得分:0)

查看DatabaseAnswers,了解他们是否有符合您需求的现有架构。

答案 3 :(得分:0)

OODBMS的重点是允许您将数据模型设计为仅在内存中。不要把它想象成一个数据库模式问题,假设你拥有大量的虚拟机和有限的物理内存,就把它想象成一个数据建模问题,你要确保你没有煮沸页面错误的海洋(或者,事实上,数据库I / O操作)来执行重要的操作。