2010-03-01 154 views
2

我徒勞地試圖學習如何使用對象數據庫。在數據庫教科書中,傳統似乎是使用跟蹤學生,課程和課程的例子,因爲它非常熟悉和適用。這個例子看起來像什麼樣的對象數據庫?關係數據庫看起來像設計文檔數據庫模式

Student 
    ID 
    Name 
    Address 

Course 
    ID 
    Name 
    PassingGrade 

Class 
    ID 
    CourseID 
    Name 
    StartTime 

StudentClass 
    ID 
    ClassID 
    StudentID 
    Grade 

你會保持StudentClasses類的裏面是反過來,內部課程,然後保持學生作爲一個頂級實體?

Student 
    ID 
    Name 
    Address 

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

回答

0

在純粹的OODB中,您的模型很好。

+0

爲什麼我需要一個ORM?如果我使用的是mongo這樣的東西已經是一個對象了,不是嗎? – stimms 2010-03-01 01:44:16

+0

沒有地方,但它是一個對象數據庫而不是關係數據庫,所以使用對象關係映射器是沒有意義的。沒有關係數據庫來映射。 – stimms 2010-03-01 02:24:13

0

看看DatabaseAnswers看看他們是否有現成的模式來滿足您的需求。

0

OODBMS的重點在於允許您設計數據模型,就好像它只是在內存中一樣。不要認爲它是一個數據庫模式問題,在假定您擁有大量虛擬機和有限的物理內存的情況下,將其視爲數據建模問題,您希望確保您沒有熬過頁面錯誤的海洋(或實際上,數據庫I/O操作)來執行重要的操作。

3

所以,你必須Course S,Student S和Class ES,這是Course小號零件和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)) 

這將會給你兩個類別:一爲Student S和一個用於Course秒。 Attendance將被嵌入在ClassES中,並且ClassES將被嵌入在Courses中。像這樣的(僞)的東西:

Student = { 
    name: String, 
    address: String 
} 

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

你當然可以把在學生對象的等級信息,但最終是不是真的有什麼可以做,以擺脫額外的類的。