我們該如何設計資料庫(三)

來源:互聯網
上載者:User

在《我們該如何設計資料庫二)》中,園友Jacklondon Chen提出了一些問題,大致如下:

“man/woman應該設計在同一張表中。 使用者表大多都設計成一個表。連分 administrator 和 user 都不應該。”

我想還是因為我舉例太隨意,因為博文中Man和Woman只有4個差異屬性:HasCar\HasHouse\HasMoney,以及IsBeauty。

其實對於這個問題我無力吐槽什麼,簡單的說說吧:假設為Man使用者實現的是一個徵婚系統,而Woman使用者實現的是一個選美系統。這麼說應該能理解Man和Woman的不能並同一張表的原因了吧。

廢話說完,本文開始

現在有一個系統,我們暫時假設為學校選課系統。有兩類使用者Teacher和Student,還有一張Curriculum表是課程總表,來儲存學校一共有哪些課程,每門課的學分什麼的。然後一個老師,一門課程和多名學生,就可以開始上課了。

表結構如:

邏輯很簡單,一目瞭然。

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

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

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

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

最簡單的思路莫過於表中加冗餘欄位。比如說將表設計成這樣:

如果我們的系統只賣兩三個學校,這樣是可行的。但是打個比方,我們的系統賣了30所學校,每個學校有一個自己的差異欄位,那麼這個表就要有30個冗餘欄位來應對這種差異性。且不說每次加冗餘都要改動系統,且不說冗餘多了浪費空間降低傳輸效率,光說怎麼維護這些冗餘,我就已經覺得是災難了:Teacher表有差異欄位,其他表也會有。假設一個中型系統,60張表,其中30張實體表30張關係表不算過分吧。那麼總共要維護 30表數量)*30冗餘數量)= 900 個差異欄位。

第二個想法是建立一張冗餘表來儲存差異。這種其實和表中加冗餘異曲同工,就不多加分析了,留給大家自己思考。

第三個想法是建立不同的資料庫。其實本來每個學校的資料庫就是不同的,唔……怎麼說呢,A學校自己的資料庫中的表,存的是A學校自己的特有欄位,B學校存B學校的特有欄位。兩者之間並無關係,然後Model用l繼承的思路來設計詳見上一篇文章),通過設定檔來選擇恰當的資料庫和其對應的Model。

是的,這種方法挺好的,唯一的不足可能就是比較依賴於ORM——使用ORM來產生資料庫,以及T-SQL語句。

如果您是一個關係型資料庫的重度愛好者,那麼這篇文章到這就結束了,下面的東西不會對您胃口的。

眾所周知,因為大量使用了反射,ORM的效率不是那麼的高,而且本身關係型資料庫的可拓展性也不是那麼的好。

作為一個激進的開發人員,我一直希望在項目中嘗試NoSql。

下面的一篇文章我會講解如何用MongoDB來解決前文描述的差異性問題,敬請期待。

順便附上一個小測試:在.net 4環境下分別插入5W條資料,分別是EF5、Nhibernate、ADO.Net向Sql server 2008插入,以及MongoDB官方驅動向MongoDB插入。

EF耗時:00:00:25.4972758

ADO.NET耗時:00:00:23.8307860

NHibernate耗時:00:00:26.0199898

MongoDB耗時:00:00:01.9474134

在這裡,EF每次插入1000條資料批量插入),其他方式都是單條插入;NHibernate關閉了一級緩衝;

MongoDB使用的是“離弦之箭”的插入方式。

MongoDB使用的是安全的插入模式不會遺失資料)。

原文連結:http://www.cnblogs.com/CrazyJinn/archive/2012/09/25/2701284.html

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.