国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > 綜合 > 正文

邏輯數(shù)據(jù)模型到物理數(shù)據(jù)模型的轉變

2024-07-21 02:35:45
字體:
來源:轉載
供稿:網(wǎng)友

  邏輯模型通過定義必要的數(shù)據(jù)表、表間關系及其元組數(shù)目而澄清了應用程序的實現(xiàn)領域。在邏輯設計階段要定義每一表列的屬性,比如是否接受空值、默認值、規(guī)則以及各類檢查和約束等。然后就可以把設計應用到特定的關系數(shù)據(jù)庫治理系統(tǒng) (RDBMS)——就像在地面的圓坑中打上方木樁。
  
  
  
  在前面的文章 里我曾經(jīng)提出過一個旅行社的例子,這個旅行社要面對4類客戶:
  接受傭金的其他旅行社
  享受打折優(yōu)惠、擁有一些旅行者的企業(yè)客戶
  特權組織或者俱樂部,它們接受傭金其客戶享受打折服務。
  零售服務的客戶
  我們考慮針對各個類型的客戶分別創(chuàng)建客戶表,但是這種方法會產(chǎn)生若干問題。更好的解決方案是建立唯一客戶表,通過類型字段區(qū)分每一客戶,這樣就需要第2個數(shù)據(jù)表來定義客戶的類型。這樣,我們的邏輯模型就如圖A所示。當然,真正的應用程序會復雜得多,不過我們在這里寧肯讓有關的問題和程序來得簡單一些。
  
  圖A
   邏輯數(shù)據(jù)模型到物理數(shù)據(jù)模型的轉變(圖一)
  邏輯數(shù)據(jù)模型的簡單視圖
  
  在結合客戶表之后,我們的設計就包含了定義客戶類型的一個新表。
  解決規(guī)范化問題
  
  
  給出客戶表并沒有完全終止規(guī)范化過程,我們還要考慮以下問題:
  
  企業(yè)旅行者的姓名字段還沒有成為最小的可能單元,從而破壞了1NF(First Normal Form)原則。這些旅行者可以是單獨的游客而非公司。不過解決這個問題也很簡單,我們可以創(chuàng)建兩個字段:FirstName和LastName,然后做出些有關定義。
  新的客戶表也有個性質比較嚴重的問題:接受零售服務的客戶很可能是需要FirstName和LastName字段的個人。為了簡化示例,我們不妨規(guī)定以下一條商務規(guī)則:所有的客戶都是公司,所以在目前階段還不需要解決這個問題。出于簡單的目的,我們只引入了這一條商務規(guī)則,把客戶限定為企業(yè)而非個人,這樣就不再需要進一步地設計了。
  地址信息破壞了2NF(Second Normal Form)規(guī)則。地址字段和其他完整說明客戶的所有字段而非地址字段都存在依附性。所以,某些開發(fā)人員可能會取消新表中的地址字段。不過那樣做的話,假如數(shù)據(jù)表按照BCNF規(guī)則規(guī)范化(Boyce-Codd Normal Form)則可能引入額外的數(shù)據(jù)表。在這種起來下,你可以引入地址、城市和州等數(shù)據(jù)表來遵守以上規(guī)則。此外,客戶還可能具有多個地址,比如說,一個地址專門用來通郵;一個地址專門用來寄送票據(jù)和日程表信息等等。
  客戶表中的打折和傭金字段也有問題,它們倒沒有違反什么規(guī)范化規(guī)則,但是這類字段很多往往會是空白??兆侄坞m然也沒什么壞處,但最好還是盡量避免出現(xiàn)這樣的情況。事實上,太多的空白往往是出現(xiàn)規(guī)范化錯誤的信號。所以,就我們的例子來說,兩個字段都完全說明了主鍵而且不會與其他非鍵字段形成明顯的依附關系。不過,由于可能出現(xiàn)空白字段的緣故,我們還是把這些字段移到一個新表,通過客戶標識每條記錄,然后給傭金或者折扣標記百分比。
  客戶只會有一個電話號碼嗎?假如不是這樣,客戶表內當前的電話號碼字段就破壞了1NF規(guī)則:禁止出現(xiàn)多值字段。那就是說,一個字段內不答應輸入多個電話號碼。所以電話號碼字段也必須移到一個新表中來,這樣就需要一個電話號碼表。解決的辦法是從客戶表中刪除電話號碼字段然后創(chuàng)建一個只有電話號碼的新表。
  規(guī)范化還是不規(guī)范化
  假如我們的目標是老實遵守BCNF原則,那么地址表的規(guī)范化(Normalizing)就是必須考慮的問題,我們需要按照客戶類型來標識每一地址:商務、服務交付等等。第1步是從客戶表中刪除地址字段,然后根據(jù)圖B所顯示的初始列表創(chuàng)建新的地址表。但我們還必須接著解決州和城市字段之間的依附性問題。
  
  圖B
   邏輯數(shù)據(jù)模型到物理數(shù)據(jù)模型的轉變(圖二)
  新地址表按照以上初始列表創(chuàng)建
  
  這樣又引入了兩個問題。首先,圖B中的條目沒有實現(xiàn)完全的規(guī)范化。該表破壞了3NF規(guī)則,因為非鍵字段之間存在依附性:城市和州字段互相依附。為了對該表實現(xiàn)規(guī)范化:
  
  從地址列表中刪除郵政編碼(Zip代碼)、城市、州和國家字段。
  創(chuàng)建郵政編碼表,把剛才刪除的字段移到該新表。
  在地址表中作為外鍵插入郵政編碼主鍵。
  某些開發(fā)人員可能會爭辯說讓數(shù)據(jù)表遵守BCNF可能太過分了。有些人則認為數(shù)據(jù)庫設計的規(guī)范化總是一種簡單又低廉的設計方式。事實上,某些開發(fā)者還可能更進一步創(chuàng)建城市、州甚至國家表來避免出現(xiàn)重復性的組。但是,就現(xiàn)在來看,我們主要關注的是解決依附性問題。資源和需求之間的平衡還談不上對與錯。
  
  第2個問題剛才我們已經(jīng)提到過了,但這個問題不打算在本文中得到解決。一個用在某特定小地區(qū)的應用程序也許并不需要采用一個大型的數(shù)據(jù)表來保存城市、州、ZIP代碼和國家等信息。另一方面,假如將來有可能擴大業(yè)務,你就應當考慮相關設計來謀取成功。你要確定應用程序是否需要大型的、耗費資源和降低性能的數(shù)據(jù)表來保存城市、州、ZIP代碼和國家值等客戶可能永遠都用不著的信息。在做了以上修改之后我們的設計藍圖中又冒出了一些新表,如圖C所示。
  
  圖C
   邏輯數(shù)據(jù)模型到物理數(shù)據(jù)模型的轉變(圖三)
點擊查看大圖

  采用若干新表對地址信息實現(xiàn)完全的規(guī)范化
  從邏輯模型遷移到物理模型
  
  
  數(shù)據(jù)表實現(xiàn)規(guī)范化之后,下面我們就應該著手選擇目標數(shù)據(jù)庫,把邏輯模型轉變?yōu)槲锢砟P汀?br> 且不說在理論上SQL的移植性到底如何,實際上不同的系統(tǒng)提供了不同的功能、擴展,當然也少不了bug。這些附加值說真的純粹是市場因素使然:每家開發(fā)商都在設法擴展SQL語言,希望誘導開發(fā)人員依靠于其獨特和強大的語法。這樣一來,共享數(shù)據(jù)思想實際上變得模糊起來,代價也越來越高昂,顯然應用程序太依靠于系統(tǒng)擴展了(這也正是開發(fā)商們所希望的)。
  
  Microsoft SQL Server 2000提供了UDF(用戶定義函數(shù))這種語言擴展,而它并沒有受到其他競爭產(chǎn)品的支持。微軟公司在特立獨行方面可不是唯一的家伙。Oracle的NESTED TABLE語法以及MySQL之流都提出了相當數(shù)量的個性擴展,比如后者的ENUM、SET列類型等。
  
  所有的開發(fā)商都在玩這種游戲,說起來也不能算什么壞主意,究竟消費者多了不少選擇。不過這也正是數(shù)據(jù)建模的主要原因(尤其是在開發(fā)大型應用程序的情況下)。與特定產(chǎn)品無關是最令人興奮的——這簡直就是數(shù)據(jù)庫的天堂。就數(shù)據(jù)建模的工具選擇來說,你盡可聽聽音樂、想想自己的設計,選擇一個目標然后按下按鈕產(chǎn)生腳本,由它以適合目標的語言來創(chuàng)建數(shù)據(jù)庫。否則,時間花了不少不說,在實現(xiàn)階段解決問題都夠你受的。
  
  邏輯表不總能轉變?yōu)槲锢肀?br />  
  此時,你必須根據(jù)目標數(shù)據(jù)庫所提供的功能重新檢查你的設計。偶然的情況下,某些邏輯模型中的設計可能無法變成實際的表。比如說,邏輯模型要求我們創(chuàng)建若干個表來標識以下類型:客戶、電話號碼、費用和地址。假如簡單的檢查約束就能提供好得多的解決方案,那么某些乃至以上所有的附加表都可能是不必要的。幸而我們的目標系統(tǒng)SQL Server就支持檢查約束。所謂檢查約束就是限制表列答應可能值的規(guī)則。比如,某些小型整數(shù)列可以接受256個值,但是檢查約束則可以把答應值限制為最多20個值。
  
  凡事有好就有壞,檢查約束對規(guī)則也不例外。系統(tǒng)應該有能力給約束表添加新項目,對許多應用程序而言這可能是個很煩人的活。請參考比較各個方案、表或者檢查約束的優(yōu)點和缺點。
  
  
  UDF和存儲計算
  SQL Server開發(fā)者如此熱衷于UDF有一個重要原因:你可以在SELECT語句中用到它們。我們可以通過示例程序說明。現(xiàn)在假設我們根據(jù)一年內的每月銷售額付傭金。這樣設計一個簡單的UDF來接受旅行社主鍵(也可能是日期)并返回包含去年該旅行社全年每月銷售額的12列數(shù)據(jù)表。這樣做有兩個優(yōu)點:
  
  不需要額外的存儲。
  沒有保存總數(shù)和實際總和之間出現(xiàn)偏差的危險(有這種可能,因為某個bug使得更新總和表出錯)。
  另一方面,UDF當然比保存銷售總額操作要慢一些。假如性能是主要關注的問題而選擇了表存儲則會出現(xiàn)以下問題:
  
  必須用到一個13列的表,它由客戶主鍵和每月銷售額組成。
  或者創(chuàng)建一個三列的數(shù)據(jù)表(客戶主鍵、月份和月銷售額),每個月的數(shù)據(jù)作為一行記錄。
  后者意味著必須訪問12行而不是一行數(shù)據(jù),所以在處理速度上會更慢一些,假如數(shù)據(jù)記錄成千上萬則運行速度就值得注重了。這樣做也有優(yōu)點,沒有破壞任何數(shù)據(jù)。不需要覆蓋各行數(shù)據(jù);只需要增加一個新行作為月銷售額傳遞數(shù)據(jù)即可。然后假如你確定修改規(guī)則,比如考慮最近兩年的數(shù)據(jù)而非最近一年,則有關模型都不需要修改,只需要訪問客戶的24行而非12行數(shù)據(jù)即可。
  
  當然,計算得出的銷售總表也有自己的問題。雖然它并沒有明顯地破壞3NF原則,不過這個方案要求新的檢查和平衡。只要有人更新了特定定單,系統(tǒng)就必須重新計算該客戶的月銷售額。由于這個緣故,即便UDF的速度確實較慢,在不考慮性能可能顯著降低的情況下至少還是個更合理的選擇,因為它只在必要的時候才運行。那就意味著結果值會反映最新的數(shù)據(jù)。
  
  所以建模碰到了一個兩難的情況:性能和額外的工作量之間必須做出選擇。假如選擇UDF則性能會降低(可能)。假如選擇銷售總表則會在實際的開發(fā)過程中耗費更多的時間來保證計算最后傭金所需數(shù)據(jù)的準確性。這里沒有對錯之分,業(yè)務和用戶(有時)決定了最終的解決方案。不過這也說明建模過程是何等重要。完全地規(guī)范化數(shù)據(jù)表并不一定總是正確的答案。圖D就比較了SQL Server同MySQL和Oracle的處理比較。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 沙河市| 赣州市| 专栏| 北流市| 肃北| 平远县| 分宜县| 都兰县| 苍溪县| 托里县| 洛宁县| 石城县| 南平市| 涿州市| 宁德市| 榆林市| 囊谦县| 石棉县| 陆良县| 蓝山县| 昭平县| 赤城县| 蒙城县| 扶风县| 鱼台县| 兴安盟| 玉溪市| 固始县| 浪卡子县| 云霄县| 甘孜县| 噶尔县| 岳普湖县| 惠来县| 昌都县| 通州市| 石柱| 桂林市| 罗平县| 浦北县| 汉源县|