簡單的說說吧:假設為man使用者實現的是乙個徵婚系統,而woman使用者實現的是乙個選美系統。這麼說應該能理解man和woman的不能並同一張表的原因了吧。
在《我們該如何設計資料庫(二)》中,園友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個差異字段。
第二個想法是建立一張冗餘表來儲存差異。這種其實和表中加冗餘異曲同工,就不多加分析了,留給大家自己思考。
是的,這種方法挺好的,唯一的不足可能就是比較依賴於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使用的是安全的插入模式(不會丟失資料)。
我們該如何設計資料庫
資料庫該如何設計,一直以來都是乙個仁者見仁智者見智的問題。對於某一種資料庫設計,並不能簡單的用好與不好來區分。或許真的應了那句話,沒有最好,只有最適合。討論某種資料庫設計的時候,應該在某種特定的需求環境下討論。下面來討論一下在專案中經常碰到的使用者的 儲存的問題。我在這裡套用之前網路上流行 普通 文...
我們該如何設計資料庫(一)
資料庫該如何設計,一直以來都是乙個仁者見仁智者見智的問題。對於某一種資料庫設計,並不能簡單的用好與不好來區分。或許真的應了那句話,沒有最好,只有最適合。討論某種資料庫設計的時候,應該在某種特定的需求環境下討論。下面來討論一下在專案中經常碰到的使用者的 儲存的問題。我在這裡套用之前網路上流行 普通 文...
我們該如何設計資料庫 四
其實我一直在準備另一篇博文的基礎資料,但是和朋友聊天,他問我最近在做什麼,我說在做系統log模組,並和他交流了一下,於是這篇部落格就應運而生。其實我一直在準備另一篇博文的基礎資料,但是和朋友聊天,他問我最近在做什麼,我說在做系統log模組,並和他交流了一下,於是這篇部落格就應運而生。所有資料都可以用...