2012-04-19 74 views
3

我很困惑(精神上)連接數據庫和麪向對象的編程。如何編碼多對多的關係?

想象一下,一個老師的成績簿應用,例如,與顯示在表格的行學生和分配在列的UI。基礎數據庫可能包含多對多關係:學生有許多作業,而作業有很多學生。

底層代碼是如何工作的?你是否有一個帶有變量引用賦值列表的Student類?或者是一個帶有一個引用學生列表的變量的Assignment類?都? ...你有什麼樣的StudentAssignment類來鏈接Student和Assignment的實例嗎? (如果是這樣,這是否意味着一個班有50名學生,10個作業同時在內存中有500個StudentAssignment對象,50個Student對象和10個Assignment對象?)...然後,這些不同的類主要由(for例如)使用底層數據庫的SQL語句?

我知道有很多的問題在這裏,但他們都挺一起去的...什麼是編碼許多一對多的關係,普遍接受的策略是什麼?

p.s.只是所以你不認爲我是懶惰的,我確實看看其他問題,如How to model a Many to many-relationship in code?Modelling a manyToMany relationship with attributes

回答

3

在數據庫中,您需要一個Student表,一個Assignment表和一個StudentAssignment的交集表。這種面向對象的表示可能只是每個學生都有一組作業。你需要看看學生有什麼特別的任務嗎?如果你這樣做,而不是通過所有方式在分配對象上填充這些信息。或者,您還可以檢查每個學生是否有特定的任務。隨你便。

數據庫在如何表示和訪問數據方面存在限制,您不必在OOP語言中使用這些數據。

雖然你絕對不需要StudentAssignment對象。該表格表達了一種關係,而不是一個實體。

編輯:

如果您需要從分配給誰具有分配,以及來自學生,以自己的所有作業的學生去,你就需要50個學生對象,10分配對象。當你創建這些對象時,你會想要用它們的關聯對象填充每個對象上的集合(一個Student將有一個List Assignments,反之亦然)。

比方說,你這樣做:

創建所有學生的對象(這將返回50條記錄),他們的任務集合設置爲一個emty列表。

SELECT 
    StudentName, 
    ID 
FROM 
    Student 

創建所有分配的對象(這將返回10條記錄),他們的學生集合設置爲空表。

SELECT 
    AssignmentName, 
    ID 
FROM 
    Assignment 

比方說,你查詢的所有數據的東西,如:(假設每個學生都有各自的分配,這將返回500條記錄)

SELECT 
    Student.ID [StudentID], 
    Assignment.ID [AssignmentID] 
FROM 
    Student 
    INNER JOIN StudentAssignment ON Student.ID = StudentAssignment.StudentID 
    INNER JOIN Assignment ON Assignment.ID = StudentAssignment.AssignmentID 

你想遍歷這些500條記錄,爲每個關係添加相應的對象。你仍然只有60個對象(50 + 10),但他們的關係將由每個對象具有的作業或學生集合定義。

+0

那麼,這是否意味着(在上面的例子中)程序需要創建50個學生對象,10個賦值對象和調用StudentAssignment交集表的任何時候關於學生作業的信息將被顯示和/或操縱? – 2012-04-19 20:44:05

+0

@AIC請參閱我的編輯 – 2012-04-19 22:40:12

+0

謝謝你的迴應,並編輯! – 2012-04-19 23:12:25

1

你的困惑是可以理解的,翻譯SQL模式來OO往往是混亂的,因爲它們是不同的模式。

如果您認爲OO提供了一種抽象掉底層實現,那麼你將有一個答案更清晰的路徑。爲每個SQL表創建一個對象在清晰度或更好的抽象層方面確實無法爲您帶來任何收益。

您是否有一個學生課程,其變量引用了 作業?或者是一個帶有變量引用列表 的學生的作業類?都?

我可能會做的,這主要取決於數據訪問模式。

你有某種學生和分配的StudentAssignment級聯情況下的?

不,這是沒有必要的。在您的StudentAssignment類中隱藏此實現細節。

然後做這些不同種類大多由(例如)SQL語句 與底層數據庫的工作?

就可以了,而且往往會在現實生活中,但你也可以讓他們調用實際訪問數據的其他類,例如,使用Repository模式。