0

從傳統的ER圖數據庫中心的方法來到設計應用程序,使用面向對象的方法實現類引起混淆等示於以下實施例中過渡到OOP方式

1)實施了許多類對許多關係。

假設你有兩個實體,教授和學院有如下關係(我不知道怎麼畫在SO否則我會說明的實例與圖):

  • 一個教授可以在不同的學院工作以不同的能力例如講師,客座講師,實驗員,研究員等
  • 一所高校可/將有許多教授在像講師,客座講師,實驗員,研究員等

不同的位置這樣做的ER方式工作,我們有這樣

CollegeTable(CollegeId,CollegeName)
ProfessorTable (ProfessorId,ProfessorName))
LecturerTable(LecturerId, CollegeId,ProfessorId,時序))

所以多對多關係是一個包含實體和其他關係特定數據的主鍵的表。如果我要創建類,以表示我的錶行,他們會像

class CollegeData 
{ 
    string CollegeId; 
    string CollegeName; 
} 

class ProfessorData 
{ 
    string ProfessorId; 
    string ProfessorName; 
} 

class LecturerData 
{ 
    string CollegeId; 
    string ProfessorId; 
    DateTime Timings; 
} 

但做同樣的OOP和映射實體類,我們將不得不爲如此如下

class College 
{ 
    string CollegeId; 
    string CollegeName; 
} 

class Professor 
{ 
    string ProfessorId; 
    string ProfessorName; 
} 

class Lecturer 
{ 
    College aCollege; 
    Professor aProfessor; 
    DateTime Timings; 
} 

現在正在做正確的OO方式在系統上引入了更多的負載,因爲現在我們在多對多的類中創建完整的類對象,而不是僅具有ID字段。當我們說一個講師添加/編輯頁面,我們可以編輯時間表或改變教授時,請考慮這個含義。我們不需要完整的教授或學院對象(因爲他們將有自己的主頁添加/編輯),只有他們的ID。

2)實現一對一關係的類。

上面的例子擴展,假設我們有一個院長實體與下面的約束(爲簡單起見,假設院長是不是教授)

  • 一所大學可以有一個院長,一個人可以只作爲院長工作一所大學。

再次ER方式,我們將有

class DeanData 
{ 
    string DeanId; 
    int DeanExp; 
} 

class CollegeData 
{ 
    string CollegeId; 
    string CollegeName; 
    string DeanId; 
} 

,而這樣做的OOP方式

class Dean 
{ 
    string DeanId; 
    int DeanExp;  
} 

class College 
{ 
    string CollegeId; 
    string CollegeName; 
    Dean aDean; 
} 

也映射OO的問題,在關係自己的表結構表現對象數據庫時保存或加載數據。有沒有什麼辦法可以用適當的OO方式完成,但沒有「冗餘」?或者這是否是爲了做OO方式而付出的代價?

回答

2

這個問題,正如你認爲的那樣,實際上比你描述的還要糟糕一些,因爲你稱之爲「正確的OO方式」實際上應該在一對多關係的一端有回引用。

例如,你的學院,講師,教授模型應該看起來更像是這樣的:

class College 
{ 
    string CollegeId; 
    string CollegeName; 
    List<Lecturer> aLecturers; // <=NOTE THIS 
} 

class Professor 
{ 
    string ProfessorId; 
    string ProfessorName; 
    List<Lecturer> aLecturers; // <=NOTE THIS 
} 

class Lecturer 
{ 
    College aCollege; 
    Professor aProfessor; 
    DateTime Timings; 
} 

,當你發現這個創建開銷,只要有全面的對象您的數據庫中只包含你是對的整數外鍵值。

重要的區別是您不應該將存儲在您的DBMS中的所有數據同時加載到對象層次結構中。

從編碼的角度來看,很多人喜歡使用ORM框架來自動創建對象。 ORM可以根據設計合理的關係數據庫,去除很多構建對象的繁瑣工作。

1

如果您打算根據DDD原則設計模型,那麼您不需要在模型中使用雙向關聯。

烏迪大漢寫了一篇很好的博客文章關於這個主題,我會建議您閱讀:

DDD & Many to Many Object Relational Mapping