成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們該如何設計數據庫(三)(續)

數據庫 數據庫運維
上篇博客《我們該如何設計數據庫(三)》寫出來之后,深感自己寫得不夠清晰,虎頭蛇尾,描述問題用了很多篇幅,而問題的解決方案及其優缺點卻是一筆帶過,于是就寫下了這篇博客來負荊請罪。

上篇博客《我們該如何設計數據庫(三)》寫出來之后,深感自己寫得不夠清晰,虎頭蛇尾,描述問題用了很多篇幅,而問題的解決方案及其優缺點卻是一筆帶過,于是就寫下了這篇博客來負荊請罪。

示例代碼下載:點擊這里下載 

示例代碼說明見下文

首先讓我們來回顧一下《我們該如何設計數據庫(三)》中描述的問題:

現在有一個系統,我們暫時假設為學校選課系統。

系統要按學校來賣。每個學校的選課邏輯都是一樣的,而表中的數據有共性,但是也有差異性。比如說基本的Teacher表結構是這樣的:

現在把系統賣給A學校。A學校除了的Teacher表除了用戶名和密碼之外,還要儲存老師的FirstName和LastName,那么表結構變化如下:

現在B學校也買了我們的系統。他們的Teacher表不要FirstName和LastName,但是要儲存教師的工號“Number”,表結構如下:

好,現在我們的問題出來了:怎么去解決這種差異性

大致有3種解決方法

1、表中加冗余

2、增加冗余表

3、model繼承

 

第一種思路:表中加冗余,在上篇已經分析過了,在此就稍微說一下優缺點。

優點在于簡單:思路簡單,實現也簡單

缺點在于維護困難:①如果我們的系統賣了很多所學校,那么對于系統維護人員來說,這是一場噩夢 ②違背開閉:每次加字段都要去修改已有Model

第二種思路:增加冗余表

如上一篇文章中徐少俠所言,我們也可以這樣來設計,用一張冗余表來儲存差異字段,如圖所示:

 

FirstName、LastName、Number對應擴展表內的三行。

這樣的好處在于:思路簡單,實現相比第一種思路復雜一些,但是也不算復雜。

缺點在于:①Join 。

②違背開閉:每次加字段都要去修改已有Model。

(徐少俠在留言中也說了缺點:查詢數據時候比較辛苦.只能用在讀寫壓力不高的地方.)

第三種思路:Model繼承

這種方法,比較適合使用ORM,或者說適合有Code First的ORM。

在這里使用的是EF5(EF5推薦環境是.NET 4.5,不過.NET 4也無傷大雅)

  1. public class Identifier  
  2.     {  
  3.         [Key]  
  4.         public int ID { get; set; }  
  5.     }  
  6.  
  7.     public interface Contact  
  8.     {  
  9.         string Phone { get; set; }  
  10.         string Email { get; set; }  
  11.     }  
  12.  
  13.    public class TeacherBase : Identifier, Contact  
  14.     {  
  15.         [StringLength(50)]  
  16.         public string UserName { get; set; }  
  17.  
  18.         [StringLength(50)]  
  19.         public string Pwd { get; set; }  
  20.  
  21.         [StringLength(50)]  
  22.         public string Phone { get; set; }  
  23.  
  24.         [StringLength(50)]  
  25.         public string Email { get; set; }  
  26.     } 

這樣就是我們的Teacher基礎表。

那么我們的系統賣給我A學校,A學校Teacher表有兩個自己的差異字段:FirstName,LastName。那么Model就要這樣寫。

  1. namespace Model.A  
  2. {  
  3.     public class Teacher : TeacherBase  
  4.     {  
  5.         [StringLength(50)]  
  6.         public string FirstName { get; set; }  
  7.  
  8.         [StringLength(50)]  
  9.         public string LastName { get; set; }  
  10.     }  

生成出來的數據庫如圖:

然后又把系統賣給了B學校。B學校系統的部署是獨立的。B學校Teacher表差異字段為Number:

  1. namespace Model.B  
  2. {  
  3.     public class Teacher : TeacherBase  
  4.     {  
  5.         [StringLength(50)]  
  6.         public string Number { get; set; }  
  7.     }  

生成出來的數據庫如圖:

#p#

這樣做的優勢在于:

1、使用了OO的思想來設計Model,更易于理解與后期維護。

對于查看類的繼承關系,VS也提供了很好的支持,比如說你可以這樣看:

你也可以這樣看:

2、更清晰的關注點分離.

其實這個是Code First的好處,讓程序員可以直接從Model寫起,不必關注數據庫中的表結構。

如果您對于使用ORM自生成數據庫有疑問,請自行百度"Code First"和"數據遷徙"。也歡迎留言討論。

這樣做的缺點在于:

1、依賴ORM

2、違背開閉原則:要修改Namespace來切換Model(詳情見下文)  想要切換Model,要修改一處地方(見下文),雖然修改很少,但還是讓人不爽。

3、違背了第三范式:

如Contact,根據第三范式應該獨立作為一個表,但是這里卻是寫入了Teacher表中。

也的確有無數人——朋友,同事,網友——吐槽過我對于第三范式的違反,但是我還是堅持:嚴格的一對一關系,就是應該寫到各個表中,而不是獨立作為一個表。

違反第三范式的好處在于:更少的Join。

而壞處在于:如果要修改,則要修改很多地方。例如Teacher和Student都有Contact,那么如果Contact要加一列Fax,那么要修改兩處地方,這可能帶來額外的錯誤。但是這個缺點因為使用了Model繼承,將不再那么明顯:修改Contact接口,然后修改實現了Contact接口的Teacher與Student的Model;因為有智能提示的存在,這樣不會出錯。

為了方便理解,我上傳了源代碼:點擊這里下載

請用VS2010打開,VS2008我不確定能不能運行。請確保有本地數據庫的權限。

打開之后直接運行,會在本地數據庫生成DBaccess.B.Context名字的數據庫。

在程序中我沒有寫數據遷徙,所以如果您修改了Model,要把之前生成的數據庫刪掉之后再運行;直接運行會報錯。

如果想切換Model,將“Test”中的using Model.B改為using Model.A即可。

這也意味著切換數據庫要修改命名空間。對于這個問題我還沒有好的解決辦法。本來是想用反射工廠來解決這個問題(代碼中未實現的ModelFactory),但是反射出來的是Object,要As了之后才能用

如果有哪位大牛有解決辦法,求告知,小弟在此跪謝。

現在實現了ModelFactory,使用了預編譯指令來選擇NameSpace:

  1. #define A  
  2. #if B  
  3. using Model.B;  
  4. using DBaccess.B;  
  5. #endif  
  6. #if A  
  7. using Model.A;  
  8. using DBaccess.A;  
  9. #endif 

若要切換Model,將#define B 改為 #define A 即可。

就此擱筆

原文鏈接:http://www.cnblogs.com/CrazyJinn/archive/2012/10/10/2716052.html

責任編輯:林師授 來源: 博客園
相關推薦

2013-03-20 11:33:31

2013-03-20 11:25:47

數據庫數據庫設計

2013-03-20 13:25:53

數據庫數據庫設計

2013-03-20 13:35:12

數據庫數據庫設計

2012-04-28 10:07:43

數據庫數據庫設計

2011-05-19 11:01:14

ERWin數據庫設計

2023-10-16 09:00:00

數據庫分布式系統

2017-03-03 15:23:46

數據庫設計范式

2017-07-06 15:52:22

大數據數據分層數據倉庫

2022-06-30 18:17:00

數據集云數據建模計數據倉庫

2020-12-31 05:29:25

數據庫Powerdesign建模

2021-10-03 15:00:44

數據庫mysql單機

2011-04-12 10:59:46

Oracle數據庫

2017-11-27 06:01:37

數據庫中間件中間層

2017-11-30 08:56:14

數據庫中間件架構師

2015-06-23 13:56:30

數據庫設計面向對象

2017-11-23 15:06:14

前端數據庫開發

2022-12-27 08:38:45

關系型數據庫設計

2018-06-04 12:06:23

數據庫

2018-07-27 06:08:12

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产乱码久久久久久影片 | 亚洲国产精品久久久久久 | 午夜免费看视频 | 国产农村妇女毛片精品久久麻豆 | 91久久电影 | 中文久久| 国产清纯白嫩初高生在线播放视频 | 午夜精品一区二区三区在线 | 亚洲午夜小视频 | www.久久久久久久久久久久 | 亚洲一区二区视频在线观看 | 女人一区 | 亚洲欧美日韩国产综合 | 天天射视频 | 日韩视频一区 | 久久国产精品91 | 欧美精品一区二区在线观看 | 91久久综合| 网络毛片 | 高清国产一区二区 | 中文字幕一区二区三区四区五区 | 九色在线观看 | 日韩精品一区二区三区视频播放 | 国产日韩一区二区三免费高清 | 亚洲国产精品一区在线观看 | 精品国产伦一区二区三区观看体验 | 欧美二区在线 | 香蕉二区| 999热精品| 中文字幕一区二区三区在线乱码 | 亚洲精品久久久一区二区三区 | 欧美精品影院 | 国产视频中文字幕 | 操人网 | 国产精品区一区二区三 | 久久久久国产精品一区二区 | 亚洲成人三区 | 婷婷激情综合 | 久久久久久国产 | 国产成人免费视频网站高清观看视频 | 国产精品九九九 |