【正文】
客戶等信息。s conformity to Codd39。t applytoprimary addition,mostdatabase implementations support the conceptof anunnull fieldconstraint that preventsnullvaluesin ,空值的系統(tǒng)化處理 RDBMS 支持空值 (不同于空的字符串或空白字符串,并且不為 0)系統(tǒng)化的表示缺少的信息,且與數(shù)據(jù)類型無關(guān)。 Rule10: Integrity Independence Thedatabase language(like SQL)should support constraintsonuser input that maintaindatabase fully implementedby most major aminimum,all databases do preserve two constraints through ponentof aprimarykey can have anull value.(seerule3)If aforeignkeyis definedin oable,any valuein it must existas aprimarykeyin ,數(shù)據(jù)完整的獨(dú)立性關(guān)系數(shù)據(jù)庫的完整性 約束必須是用數(shù)據(jù)子語言定義并存貯在目錄中的,而不是在應(yīng)用程序中加以定義的。s will use the relational query language of choice,SQL,to illustrate these concepts and explain relational database structure in detail. 特別聲明: 1:資料來源 于互聯(lián)網(wǎng),版權(quán)歸屬原作者 2:資料內(nèi)容屬于網(wǎng)絡(luò)意見,與本賬號立場無關(guān) 3:如有侵權(quán),請告知,立即刪除。 Rule8: Physical Data Independence Theuseris isolatedfrom the physical methodof storingand retrieving informationfrom can be madeto the underlying architecture(hardware,disk storage methods)without affecting how theuser accesses ,數(shù)據(jù)的物理獨(dú)立性無論數(shù)據(jù)庫的數(shù)據(jù)在存儲表示上或存取方法上做任何變化,應(yīng)用程序和終端活動要都保持邏輯上的不變性。 Rule 2: Guaranteed Access Rule All data should be accessible without can be acplished through abination of the table name,primary key,and column ,保證訪問準(zhǔn)則依于表名,主鍵和列名,保證能以邏輯方式訪問數(shù)據(jù)庫中的每個數(shù)據(jù)項(xiàng)。換句話說,針對每一種最終表達(dá)數(shù)據(jù)的原型應(yīng)用,保證你檢查了數(shù)據(jù)模型并且查看如何取出數(shù)據(jù)。 假如你需要編碼,那你可以在編碼旁附上用戶知道的英語。不管你選擇哪種方式,總要對你的數(shù)據(jù)庫文檔化,或者在數(shù)據(jù)庫自身的內(nèi)部或者單獨(dú)建立文檔。這樣將減少鍵入代碼的錯誤和誤解同時提供數(shù)據(jù)的一致性。這樣做還等于在處理數(shù)據(jù)庫變更時給你提供了更多的自由。為了進(jìn)行這種數(shù)據(jù)傳輸,請寫下你自己的批處理或者調(diào)度程序以特定時間間隔運(yùn)行而不要讓用戶在每天的工作后傳輸數(shù)據(jù)。除非你的字段命名很冗長,否則字段名本身還不夠。你要做 的無非是創(chuàng)建毫無價值的數(shù)據(jù)。而這一過程往往錯誤叢生所以應(yīng)該盡量避免。 所以還是重提一句老話:你的設(shè)計(jì)要適應(yīng)用戶而不是讓用戶來適應(yīng)你的設(shè)計(jì)。后來,隨著盜取身份犯罪案件的增加,我現(xiàn)在的同行正痛苦地從一大攤子數(shù)據(jù)中把 SSN或 ID刪除。還有,不要索引 memo/note 字段,不要 索引大型字段 (有很多字符 ),這樣作會讓索引占用太多的存儲空間。 *避免使用復(fù)合鍵。 采用系統(tǒng)生成鍵作為主鍵還有一個優(yōu)點(diǎn):當(dāng)你擁有一致的鍵結(jié)構(gòu)時,找到邏輯缺陷很容易。采用后者作為主字段,數(shù)據(jù)庫更新后重新索引和檢索就快多了。 這樣從數(shù)據(jù)庫中選出全部數(shù)據(jù)的 SQL語句可以寫成如下所示: Select*From Customer,Order Where cu_surname=MYNAME; and cu_name_id=or_cust_name_id and or_quantity=1 在沒有這些前綴的情況下則寫成這個樣子 (用別名來區(qū)分 ): Select*From Customer,Order Where =MYNAME; and = and =1 第 1個 SQL語句沒少鍵入多少字符。這算浪費(fèi)空間嗎 ?是有一點(diǎn),但也沒你想象的那么多:一個字段加長 3個字符在有 1百萬條記錄,再加上一點(diǎn)索引的情況下才不過讓整個數(shù)據(jù)庫多占據(jù) 3MB 的空間。 包含版本機(jī)制 建議你在數(shù)據(jù)庫中引入版本控制機(jī)制來確定使用中的數(shù)據(jù)庫的版本。假如數(shù)據(jù)類型在一個表里是整數(shù),那在另一個表里可就別變成字符型了。這一問題從 Access 到 Oracle 數(shù)據(jù)庫都存在。非標(biāo)準(zhǔn)化和加速訪問之間的妥協(xié)是有一定意義的。 采用一般抽象術(shù)語來標(biāo)識 事物 的類別可以讓你在關(guān)聯(lián)數(shù)據(jù)以滿足業(yè)務(wù)要求方面獲得巨大的靈活性,同時這樣做還可以顯著降低數(shù)據(jù)存儲所需的冗余量。這樣,你的PERSON_TYPE 表就包含了所有 PERSON 的可能類型,比如 Associate、 Engineer、Director、 CIO或者 CEO 等。雖然我不得不這么做,但我絕不把數(shù)據(jù)表的非標(biāo)準(zhǔn)化當(dāng)作當(dāng)然的設(shè)計(jì)理念。 *表內(nèi)不應(yīng)該存儲依賴于其他鍵的非鍵信息。比方說,假如你的用戶界面要訪問外部數(shù)據(jù)源 (文件、 XML 文檔、其他數(shù)據(jù)庫等 ),你不妨把相應(yīng)的連接和路徑信息存儲在用戶界面支持表里。所以,在建立系統(tǒng)存儲客戶信息時,我傾向于在單獨(dú)的一個數(shù)據(jù)表里存儲姓氏字段,而且還附加起始日和終止日等字段,這樣就可以跟蹤這一數(shù)據(jù)條目的變化。這樣的檢索性能比較低而且容易引起混亂。模式有助于提高協(xié)作效能,這樣在先期的數(shù)據(jù)庫設(shè)計(jì)中幾乎不可能出現(xiàn)大的問題。這樣你就可以讓你的客戶糾正你自己的理解然后做好下一步的 ER 設(shè)計(jì)。 在物理實(shí)踐之前進(jìn)行邏輯設(shè)計(jì) 在深入物理設(shè)計(jì)之前要先進(jìn)行邏輯設(shè)計(jì)。我在實(shí)現(xiàn) SQL Server 2021 時用 udf_(或者類似的標(biāo)記 )標(biāo)識我編寫的函數(shù)。對列 [字段 ]名應(yīng)該采用標(biāo)準(zhǔn)的前綴和后綴。顯然,現(xiàn)有系統(tǒng)并不完美,否則你就不必再建立新系統(tǒng)了。 所以我歸納歷年來所走的彎路及體會,并在網(wǎng)上找了些對數(shù)據(jù)庫設(shè)計(jì)頗有造詣的專業(yè)人士給大家傳授一些設(shè)計(jì)數(shù)據(jù)庫的技巧和經(jīng)驗(yàn)。 不過,就如我們反復(fù)強(qiáng)調(diào)的那樣,再好的老師也比不過經(jīng)驗(yàn)的教誨。大多數(shù)數(shù)據(jù)庫項(xiàng)目都不是從頭開始建立的;通常,機(jī)構(gòu)內(nèi)總會存在用來滿足特定需求的現(xiàn)有系統(tǒng) (可能沒有實(shí)現(xiàn)自動計(jì)算 )。比如,如果鍵是數(shù)字類型,你可以用 _N作為后綴;如果是字符類型則可以采用 _C 后綴。我在和 SQL Server 打交道的時候還用過 tbl來索引表,但我用 sp_pany(現(xiàn)在用 sp_feft_)標(biāo)識存儲過程,因?yàn)樵谟械臅r候如果我發(fā)現(xiàn)了更好的處理辦法往往會保存好幾個拷貝。即使用戶認(rèn)為他們再也不需要什么支持了,我們也應(yīng)該對他們進(jìn)行這方面的教育,我們都曾經(jīng)面臨過這樣的時刻 當(dāng)初要是這么做了該多 好 .。同時還應(yīng)該用可能、將會和必須等詞匯表達(dá)出系統(tǒng)的關(guān)系基數(shù)。 創(chuàng)建模式 一張圖表勝過千言萬語:開發(fā)人員不僅要閱讀和實(shí)現(xiàn)它,而且還要用它來幫助自己和用戶對話。用戶在具有系統(tǒng)生成主鍵的表內(nèi)用副鍵進(jìn)行檢索往往會返回許多重復(fù)數(shù)據(jù)。比方說,姓氏就是如此 (注意是西方人的姓氏,比如女性結(jié)婚后從夫姓等 )。 標(biāo)準(zhǔn)化和數(shù)據(jù)驅(qū)動 數(shù)據(jù)的標(biāo)準(zhǔn)化不僅方便了自己而且也方便了其他人。 *表內(nèi)的每一行都應(yīng)該被唯一的標(biāo)識 (有唯一鍵 )。曾經(jīng)有個開發(fā)餐飲分析軟件的活就是用非標(biāo)準(zhǔn)化表把查詢時間從平均 40秒降低到了兩秒左右 。 這里的含義不是讓 PERSON 實(shí)體帶有 Title 字段,而是說,為什么不用PERSON 實(shí)體和 PERSON_TYPE 實(shí)體來描述人員呢 ?比方說,當(dāng) John Smith,Engineer 提升為 John Smith,Director 乃至最后爬到 John Smith,CIO的高位,而所有你要做的不過是改變兩個表 PERSON 和 PERSON_TYPE 之間關(guān)系的鍵值,同時增加一個日期 /時間字段來知道變化是何時發(fā)生的。最后 ADDRESS 可以具體為 Site、 Location、 Home、