版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1、數(shù)據(jù)庫簡介:數(shù)據(jù)庫是專門開發(fā)數(shù)據(jù)管理的軟件,或者說專門管理數(shù)據(jù)的軟件就是數(shù)據(jù)庫。數(shù)據(jù)庫存在的意義就是:減輕開發(fā)人員的負擔(dān)。數(shù)據(jù)庫是一個綜合的軟件,那么我們不需要隊要進行2進制保存數(shù)據(jù)進行處理了,但是卻是要與數(shù)據(jù)庫產(chǎn)生交互,那么命令式sql,有技巧的 ,數(shù)據(jù)庫就是萬物皆關(guān)系(面向?qū)ο?,萬物皆是對象)有所區(qū)別。2、數(shù)據(jù)庫的發(fā)展:一開始的是層次化的數(shù)據(jù)與網(wǎng)狀數(shù)據(jù)庫 ,后來也發(fā)現(xiàn)使用確實很麻煩。于是到了1970年ef.cold博士(ibm公司的研究員)開創(chuàng)了關(guān)系性的數(shù)據(jù)庫的先驅(qū),發(fā)表了關(guān)系性數(shù)據(jù)庫的論文 ,但是由于當(dāng)時電腦硬件的局限性,大家覺得跑如此大的程序不值得。后來,oracle(甲骨文)公司
2、的創(chuàng)始人,拉里帶領(lǐng)oracle投入到關(guān)系型數(shù)據(jù)庫的研發(fā),并且得到了一個大客戶 美國國防部。隨即開始世界刮起了關(guān)系數(shù)據(jù)庫的旋風(fēng),隨后各個公司都紛紛推出自己的數(shù)據(jù)庫系統(tǒng)。比如:ibm的db2 ,還有風(fēng)靡一時的dbs3。但是隨即出現(xiàn)不兼容的問題,由于最早的時候都沒有進行沒規(guī)范。所以到最后各個數(shù)據(jù)庫巨頭統(tǒng)一了操縱數(shù)據(jù)庫的sql(結(jié)構(gòu)化struct數(shù)據(jù)查詢語言) 變成了標準語言,而關(guān)系型數(shù)據(jù)庫也儼然變成大家的寵兒,oracle也從一個小公司,變成現(xiàn)在的數(shù)據(jù)庫巨頭,而我們的微軟也推出了sqlserver。當(dāng)然還有phper的最愛mysql。但是mysql被sun,sun被oracle收購,現(xiàn)在有免費版與收
3、費專業(yè)版了。所以我們學(xué)習(xí)sql語言的時候,先學(xué)共同點,再學(xué)特異性。各種數(shù)據(jù)庫軟件在使用上有一點區(qū)別。3、數(shù)據(jù)庫系統(tǒng)詳解:為適應(yīng)數(shù)據(jù)處理的需要而發(fā)展起來的一種較為理想的數(shù)據(jù)處理的核心機構(gòu)。計算機的高速處理能力和大容量存儲器提供了實現(xiàn)數(shù)據(jù)管理自動化的條件。 數(shù)據(jù)庫系統(tǒng)一般由4個部分組成:數(shù)據(jù)庫,即存儲在磁帶、磁盤、光盤或其他外存介質(zhì)上、按一定結(jié)構(gòu)組織在一起的相關(guān)數(shù)據(jù)的集合。(個體)數(shù)據(jù)庫管理系統(tǒng)(dbms)。一組能完成描述、管理、維護子數(shù)據(jù)庫的程序系統(tǒng)。它按照一種公用的和可控制的方法完成插入新數(shù)據(jù)、修改和檢索原有數(shù)據(jù)的操作。數(shù)據(jù)庫管理員(dba)。用戶和應(yīng)用程序。(微軟的稱作ssms)4、數(shù)據(jù)庫系
4、統(tǒng)的基本要求是:1、能夠保證數(shù)據(jù)的獨立性。數(shù)據(jù)和程序相互獨立有利于加快軟件開發(fā)速度,節(jié)省開發(fā)費用。2、冗余數(shù)據(jù)少,數(shù)據(jù)共享程度高。3、系統(tǒng)的用戶接口簡單,用戶容易掌握,使用方便。4、能夠確保系統(tǒng)運行可靠,出現(xiàn)故障時能迅速排除,能夠保護數(shù)據(jù)不受非受權(quán)者訪問或破壞,能夠防止錯誤數(shù)據(jù)的產(chǎn)生,一旦產(chǎn)生也能及時發(fā)現(xiàn)。5、有重新組織數(shù)據(jù)的能力,能改變數(shù)據(jù)的存儲結(jié)構(gòu)或數(shù)據(jù)存儲位置,以適應(yīng)用戶操作特性的變化,改善由于頻繁插入、刪除操作造成的數(shù)據(jù)組織零亂和時空性能變壞的狀況。6、具有可修改性和可擴充性、可維護性。7、能夠充分描述數(shù)據(jù)間的內(nèi)在聯(lián)系。 5、數(shù)據(jù)庫(database):由眾多的數(shù)據(jù)、數(shù)據(jù)表、約束、存儲
5、過程、函數(shù)、視圖、索引構(gòu)成的一個數(shù)據(jù)存儲與交互單元,是按照數(shù)據(jù)結(jié)構(gòu)來組織、存儲和管理數(shù)據(jù)的倉庫。6、數(shù)據(jù)表(table):數(shù)據(jù)表,實際上是一個二維表。一般是圍繞一個事務(wù)、動作記錄,或者是一個信息主題作為一個數(shù)據(jù)表。數(shù)據(jù)表由行與列構(gòu)成。7、列(column、field):列,其實就是字段。也是決定了信息的基本單元。列,包含有數(shù)據(jù)類型的設(shè)定。8、行(row、record):行,實際上就是一條基本信息。一行包含了多列數(shù)據(jù)的存儲的信息。所以一行也有一條記錄之稱。9、行業(yè)(trade)一個行業(yè)一種需求,沒一個需求每一種數(shù)據(jù)庫的設(shè)計模式與思想。每個行業(yè)的數(shù)據(jù)設(shè)計的重點都是不同的。側(cè)重查詢(要求低范式)還是
6、操作(要求搞范式)就是自己選擇的問題了。10、索引(index)索引是一個單獨的、物理的數(shù)據(jù)庫結(jié)構(gòu),它是某個表中一列或若干列值的集合和相應(yīng)的指向表中物理標識這些值的數(shù)據(jù)頁的邏輯指針清單。索引其實就是一個b+樹,但是這個索引是nn層數(shù)次方的。目的就是在數(shù)據(jù)庫中劃分出一定的區(qū)域優(yōu)化查詢??梢蕴嵘罅繑?shù)據(jù)的查詢速度。索引一般可以分為:基于字段優(yōu)化查詢速度的普通索引、唯一性索引、主鍵索引、全文索引、單列與多列索引?,F(xiàn)在由于數(shù)據(jù)庫系統(tǒng)的不斷升級,我們只要設(shè)定索引就可以了,不需要特殊的維護。而且數(shù)據(jù)在查詢的時候也會根據(jù)查詢適當(dāng)?shù)剡x擇是利用索引查詢,還是僅僅是表查詢。由于數(shù)據(jù)庫系統(tǒng)的發(fā)展,系統(tǒng)內(nèi)部已經(jīng)自動幫
7、我們完成對索引的維護。但是在設(shè)計的時候要考慮到索引的損耗問題。數(shù)據(jù)庫db就像是一個字典,索引就是根據(jù)指定字段制成的快速指向。由于只是指向數(shù)據(jù)對象標識,真正的數(shù)據(jù)是存儲在db中,所以查詢速度極快。但是額外的內(nèi)存與硬盤花銷也是一個需要考慮的問題。比如:增加、刪除、修改時數(shù)據(jù)庫都要對索引進行維護,但是這樣也是為了最后查詢的效率的提升,特別適合w行級別的數(shù)據(jù)查詢。而索引可以分為:隱式索引(針對單個字段)、唯一索引(唯一約束)、函數(shù)索引(函數(shù)(字段)、聚簇索引(主鍵)、組合索引(最多16個field)與全文索引(text)。一般索引會占用原數(shù)據(jù)庫大小的20%。11、視圖(view)固化的子查詢,將一個子
8、查詢起了一個固化的名字,保存在數(shù)據(jù)庫中,方便以后的使用。其實調(diào)用大量的join來進行一個查詢一般也是用視圖。視圖與索引都是為了優(yōu)化查詢的速度與語句。視圖是優(yōu)化語句,索引是優(yōu)化單查速度。一般是dba來設(shè)定數(shù)據(jù)庫的視圖, 封裝內(nèi)部數(shù)據(jù)庫的數(shù)據(jù)關(guān)系,范式修改數(shù)據(jù)容易了,視圖讓我們查詢復(fù)雜關(guān)系的數(shù)據(jù)變得容易。12、觸發(fā)器(trigger)觸發(fā)器(trigger)是個特殊的存儲過程,它的執(zhí)行不是由程序調(diào)用,也不是手工啟動,而是由個事件來觸發(fā),比如當(dāng)對一個表進行操作( insert,delete, update)時就會激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則等。 觸發(fā)器可以從 dba_tr
9、iggers ,user_triggers 數(shù)據(jù)字典中查到。13、sqlserver數(shù)據(jù)類型詳解數(shù)據(jù)類型描述bit整型 bit 數(shù)據(jù)類型是整型,其值只能是0、1或空值(null)。這種數(shù)據(jù)類型用于存儲只有兩種可能值的數(shù)據(jù),如yes 或no、true 或fa lse 、on 或off 。int整型int 數(shù)據(jù)類型可以存儲從- 231(-2147483648)到231 (2147483 647)之間的整數(shù)。存儲到數(shù)據(jù)庫的幾乎所有數(shù)值型的數(shù)據(jù)都可以用這種數(shù)據(jù)類型。這種數(shù)據(jù)類型在數(shù)據(jù)庫里占用4個字節(jié)smallint整型smallint 數(shù)據(jù)類型可以存儲從- 215(-32768)到215(32767)
10、之間的整數(shù)。這種數(shù)據(jù)類型對存儲一些常限定在特定范圍內(nèi)的數(shù)值型數(shù)據(jù)非常有用。這種數(shù)據(jù)類型在數(shù)據(jù)庫里占用2個字節(jié)空間tinyint整型tinyint 數(shù)據(jù)類型能存儲從0到255 之間的整數(shù)。它在你只打算存儲有限數(shù)目的數(shù)值時很有用。 這種數(shù)據(jù)類型在數(shù)據(jù)庫中占用1 個字節(jié)numeric精確數(shù)字型numeric數(shù)據(jù)類型與decimal 型相同decimal精確數(shù)值型decimal 數(shù)據(jù)類型能用來存儲從-1038-1到1038-1的固定精度和范圍的數(shù)值型數(shù)據(jù)。使用這種數(shù)據(jù)類型時,必須指定范圍和精度。 范圍是小數(shù)點左右所能存儲的數(shù)字的總位數(shù)。精度是小數(shù)點右邊存儲的數(shù)字的位數(shù)。左邊是總數(shù)位,右邊是小數(shù)點后的數(shù)
11、位。money貨幣型money 數(shù)據(jù)類型用來表示錢和貨幣值。這種數(shù)據(jù)類型能存儲從-9220億到9220 億之間的數(shù)據(jù),精確到貨幣單位的萬分之一smallmoney貨幣型smallmoney 數(shù)據(jù)類型用來表示錢和貨幣值。這種數(shù)據(jù)類型能存儲從-214748.3648 到214748.3647 之間的數(shù)據(jù),精確到貨幣單位的萬分之一float近似數(shù)值型float 數(shù)據(jù)類型是一種近似數(shù)值類型,供浮點數(shù)使用。說浮點數(shù)是近似的,是因為在其范圍內(nèi)不是所有的數(shù)都能精確表示。浮點數(shù)可以是從-1.79e+308到1.79e+308 之間的任意數(shù)real近似數(shù)值型real 數(shù)據(jù)類型像浮點數(shù)一樣,是近似數(shù)值類型。它可以
12、表示數(shù)值在-3.40e+38到3.40e+38之間的浮點數(shù)datetime日期時間型datetime數(shù)據(jù)類型用來表示日期和時間。這種數(shù)據(jù)類型存儲從1753年1月1日到9999年12月3 1日間所有的日期和時間數(shù)據(jù), 精確到三百分之一秒或3.33毫秒,但是在輸出的時候我們可以使用拼接的技術(shù),也可以使用sqlswrver內(nèi)部的指令smalldatetime日期時間型smalldatetime 數(shù)據(jù)類型用來表示從1900年1月1日到2079年6月6日間的日期和時間,精確到一分鐘cursor特殊數(shù)據(jù)型cursor 數(shù)據(jù)類型是一種特殊的數(shù)據(jù)類型,它包含一個對游標的引用。這種數(shù)據(jù)類型用在存儲過程中,而且創(chuàng)
13、建表時不能用timestamp特殊數(shù)據(jù)型timestamp 數(shù)據(jù)類型是一種特殊的數(shù)據(jù)類型,用來創(chuàng)建一個數(shù)據(jù)庫范圍內(nèi)的唯一數(shù)碼。 一個表中只能有一個timestamp列。每次插入或修改一行時,timestamp列的值都會改變。盡管它的名字中有“time”, 但timestamp列不是人們可識別的日期。在一個數(shù)據(jù)庫里,timestamp值是唯一的uniqueidentifier特殊數(shù)據(jù)型uniqueidentifier數(shù)據(jù)類型用來存儲一個全局唯一標識符,即guid。guid確實是全局唯一的。這個數(shù)幾乎沒有機會在另一個系統(tǒng)中被重建??梢允褂胣ewid 函數(shù)或轉(zhuǎn)換一個字符串為唯一標識符來初始化具有唯一
14、標識符的列char字符型char數(shù)據(jù)類型用來存儲指定長度的定長非統(tǒng)一編碼型的數(shù)據(jù)。當(dāng)定義一列為此類型時,你必須指定列長。當(dāng)你總能知道要存儲的數(shù)據(jù)的長度時,此數(shù)據(jù)類型很有用。例如,當(dāng)你按郵政編碼加4個字符格式來存儲數(shù)據(jù)時,你知道總要用到10個字符。此數(shù)據(jù)類型的列寬最大為8000 個字符varchar字符型varchar數(shù)據(jù)類型,同char類型一樣,用來存儲非統(tǒng)一編碼型字符數(shù)據(jù)。與char 型不一樣,此數(shù)據(jù)類型為變長。當(dāng)定義一列為該數(shù)據(jù)類型時,你要指定該列的最大長度。 它與char數(shù)據(jù)類型最大的區(qū)別是,存儲的長度不是列長,而是數(shù)據(jù)的長度。其實就是可變長的char類型。text字符型text 數(shù)據(jù)類
15、型用來存儲大量的非統(tǒng)一編碼型字符數(shù)據(jù)。這種數(shù)據(jù)類型最多可以有231-1或20億個字符。有點像blob、clob,只保留16個字節(jié)的地址,速度會變慢。它不是char所以字符串的函數(shù)對其無效ntext字符型也是用unicode的text。nchar統(tǒng)一編碼字符nchar 數(shù)據(jù)類型用來存儲定長統(tǒng)一編碼字符型數(shù)據(jù)。統(tǒng)一編碼用2個字節(jié)來存儲每個字符,而不是用單字節(jié)(普通文本中的情況)。它允許大量的擴展字符。此數(shù)據(jù)類型能存儲4000種字符,使用的字節(jié)空間上增加了一倍??梢葬槍μ厥獾淖址?。就會使用unicode的編碼來存儲。8000個字節(jié)。nvarchar統(tǒng)一編碼字符型nvarchar 數(shù)據(jù)類型用作變長的統(tǒng)
16、一編碼字符型數(shù)據(jù)。此數(shù)據(jù)類型能存儲4000種字符,使用的字節(jié)空間增加了一倍。變長、特殊字符。這種unicode編碼要比char、varchar存儲相同的數(shù)據(jù)耗用了ntext統(tǒng)一編碼字符型ntext 數(shù)據(jù)類型用來存儲大量的統(tǒng)一編碼字符型數(shù)據(jù)。這種數(shù)據(jù)類型能存儲230 -1或?qū)⒔?0億個字符,且使用的字節(jié)空間增加了一倍binary二進制數(shù)據(jù)類型binary數(shù)據(jù)類型用來存儲可達8000 字節(jié)長的定長的二進制數(shù)據(jù)。當(dāng)輸入表的內(nèi)容接近相同的長度時,你應(yīng)該使用這種數(shù)據(jù)類型varbinary二進制數(shù)據(jù)類型varbinary 數(shù)據(jù)類型用來存儲可達8000 字節(jié)長的變長的二進制數(shù)據(jù)。當(dāng)輸入表的內(nèi)容大小可變時,你
17、應(yīng)該使用這種數(shù)據(jù)類型image二進制數(shù)據(jù)類型image 數(shù)據(jù)類型用來存儲變長的二進制數(shù)據(jù),最大可達231-1或大約20億字節(jié)blob、clob統(tǒng)一編碼字符型記錄大量的文字,適合記錄博文。注:max的突破限制,可以存特別長的數(shù)據(jù)。這樣就可以突破原本的數(shù)據(jù)類型的長度限制。14、命名規(guī)范:數(shù)據(jù)庫對象前綴舉例1舉例2表(table)tbltbl_student 值域d只讀,完全,禁止,就可以實現(xiàn)訪問級別。 tbl_studentcourse_readonly字段(column)無title,studentid日期logiondate、次數(shù)logincount、鏈接loginurl、is是否、has有無
18、 或者 can 能否開頭參數(shù)(parameter)currentdate遵循pascal命名規(guī)則視圖(view)v視圖(view)存儲過程(stored procedure)prprdelorderpr操作或者動作的名字觸發(fā)器(trigger)trtrorder_d索引(index)ix_ix_customerid主鍵(primary key)pk_pk_admin外鍵(foreign key)fk_fk_order_ordertypecheck約束(check constraint)ck-ck_tablecolumnunique約束uq_uq_tablecolumn用戶定義數(shù)據(jù)類型(user
19、-defined data type)udtudtphone用戶定義函數(shù)(user-defined function)fnfnduedate15、null的三值關(guān)系 null也是一個集合,但是僅僅表示的是一個空集,但是實際上是null=unknow。1、 數(shù)值運算null為null;2、 邏輯判定null為null;3、 主外鍵聯(lián)接null為忽略;4、 語句連結(jié)null為or或真、and和假。具體可查三值邏輯的真值表。aba ba b a111101n1n010100n11nnnnnnnn0n0n011010nn01000015、特殊情況:where null = null,where col
20、umn = value:表中column為null的行永遠不會返回,即使value是null,直接斷言;case null when null then xxx:xxx永遠不會執(zhí)行,即使value是null,直接斷言;unknow判斷,if xxx else yyy end或case when then xxx else yyy end:這兩種情況下,,即是null會執(zhí)行。唯一約束(unique index)的字段只允許一個null的行,再插入或更新該字段為null的行會報字段重復(fù)的錯誤。group by時,所有null被視為一組。order by時,所有null排在一起,但null排在最前面
21、.(如sql server),或者是最后面(如oracle),sql標準未規(guī)定。聚集函數(shù)(sum/avg/max/min/count)忽略null的行,即是不返回此行數(shù)據(jù),直接斷言 declare時,在未賦值之前為null。與null處理相關(guān)的運算符和函數(shù):- is null/is not null:用這兩個運算符來判斷一個值是否為null,而不是=或;- is null/ coalesce:取第一個非空值(注意兩個函數(shù)的數(shù)據(jù)類型轉(zhuǎn)換規(guī)則不同);- nullif(a,b):等價于如果a等于b返回null,如果不等于返回b- isnull(a,b):取兩者中不為null的值,都為null返回nu
22、ll。16、not null的建表由于三值關(guān)系的存在,很多開發(fā)人員在建表的時候,除非是非null不可,基本都是允許為null的,其結(jié)果往往是一張表除了主鍵以外所有的字段都可以為null。之所以會有這樣的思路,是因為null好啊,程序不容易出錯啊,你插入記錄的時候如果不小心忘輸了一個字段,程序依然可以r運行un,而不會出現(xiàn) “xx字段不能為null”的錯誤消息。但是,這樣做的結(jié)果卻是很嚴重的,也會使你的程序變得更加繁瑣,你不得不進行一些無謂的空值處理,以避免程序出錯。更糟的是,如果一些重要數(shù)據(jù),比如說訂單的某一項值為null了,那么大家知道,任何值與null相操作(比如加減乘除),結(jié)果都是nul
23、l,導(dǎo)致的結(jié)果就是訂單的總金額也為null。你可以運行下面的代碼嘗試一下:select null + 5 as result 但是我們?nèi)绾谓鉀Q輸入為空的問題呢?我們?yōu)槭裁床皇褂梦覀儚姾返墓ぞ遚heck約束與默認值呢?field varchar(500) default nothing not null constraint ck_columnname check(len(columnname)0),type tinyint not null default 0 constraint ck_articletype check(type in (0,1,2), 所以,合理的思維方式應(yīng)該是這樣的:默
24、認這個字段是 not null的,然后判斷這個字段是不是非null不可,如果不是這樣,ok,這個字段是not null的,進行下一個字段。17、數(shù)據(jù)庫的原子性1、你的表是描述什么事物,明確表的信息對象主體2、你的表是為了適合什么操作語句的設(shè)計的,面向操作設(shè)計3、列的內(nèi)容要不要原子性的切塊,讓查詢直逼要害,列的設(shè)計的小塊的程度要拿捏好4、表必須是二維表,而且要根據(jù)不同的需求進行設(shè)計,表的設(shè)計與列的設(shè)計一樣都要依賴與操作與需求原子性的存在是為了切分適合的信息塊 ,從而達到信息的最大化、最優(yōu)化的使用,并不是無限切分就好,要看實際的應(yīng)用。但是由于原子性數(shù)據(jù)的表容易設(shè)計,而且運行的所需時間較短(查詢信息
25、的指向性比較強,同時也便于維護喝更新操作,但是卻是在海量數(shù)據(jù)搜索面前有點乏力),所以對大量的數(shù)據(jù)處理的時候要加分效果。1、 同一列中不能存在多個類型相同的值,一列不能多值(除非是)2、 同一個表中也不能存在有多個存儲相同類型數(shù)據(jù)的列3、 無重復(fù)的行,每列只存儲一份同類型下的一份數(shù)據(jù)(列是單值的),無重復(fù)列名4、18、結(jié)合信息對象與業(yè)務(wù)設(shè)計數(shù)據(jù)庫設(shè)計1、數(shù)據(jù)庫的設(shè)計師根據(jù)信息要素、關(guān)系來設(shè)計的;2、數(shù)據(jù)庫的信息查找依賴于信息的使用方式的;3、對于可有可無的東西,我們需要花點時間去好好斟酌;4、簡短的查詢,比囧長的業(yè)務(wù)查詢更加需要思考;5、使用數(shù)據(jù)的方式將會與我們占用系統(tǒng)內(nèi)存與硬盤息息相關(guān),影響著
26、服務(wù)器的整體表現(xiàn),所以我們的設(shè)計會有所倚重與側(cè)重;現(xiàn)在基本是雙數(shù)據(jù)庫,外層是方便查詢,內(nèi)層是方便修改。sql換一句話其實就是關(guān)系數(shù)據(jù)庫管理系統(tǒng) realtional database management system ,rdbms表的設(shè)計的方法:1、挑出事物對象(對象信息濃縮法)2、圍繞事物對象的信息收集(信息擴散聚攏法)3、信息拆分成塊(字段原子性)4、事務(wù)需求拆分法(關(guān)系設(shè)計)5、數(shù)據(jù)的發(fā)散與聚合程度的分析(表設(shè)計的檢驗)19、范式 1nf 2nf 3nf 4nf 1nf,主要是解決表中字段設(shè)計、信息與業(yè)務(wù)之間的關(guān)系的問題1、 數(shù)據(jù)庫表的每一列都是不可分割的基本數(shù)據(jù)項,同一列中不能有多個
27、值,即實體中的某個屬性不能有多個值或者不能有重復(fù)的屬性。在第一范式(1nf)中表的每一行只包含一個實例的信息。簡而言之,第一范式就是無重復(fù)的列,而且單列無重復(fù)的值。2、 所有屬性都必須是原子的每個屬性一個值。一個實體的所有實例都必須包含同等數(shù)量的值。一個實體的所有實例必須兩兩不相同。2nf,主要是設(shè)定主鍵,解決數(shù)據(jù)庫的數(shù)據(jù)冗余、更新、插入、更新的指向性的問題1、 要求數(shù)據(jù)庫表中的每個實例或行必須可以被唯一地區(qū)分。為實現(xiàn)區(qū)分通常需要為表加上一個列,以存儲各個實例的唯一標識。這個唯一屬性列被稱為主關(guān)鍵字或主鍵、主碼、唯一關(guān)聯(lián)。引入主鍵約束primary key,constraint pk_arti
28、cle primary key(id)。主鍵的設(shè)定也是有要求的。主鍵默認不能為空,保持唯一性。插入、更新刪、除記錄的時候必須指定主鍵的值。要求主鍵必須簡潔,主鍵值不能被修改。2、 實體必須滿足第一范式。所有屬性描述的事實都必須與整個鍵相關(guān),而不能只描述鍵的一個子集。3nf,主要是解決排除部分列之間的依賴關(guān)系,利用了表與表的主外鍵關(guān)系解決。1、 要求實體數(shù)據(jù)記錄(record)相對于外部完全依賴于主關(guān)鍵id。所謂完全依賴,是指在除主鍵外其他的屬性列之間不存在對應(yīng)依賴。如果存在,那么這一依賴部分應(yīng)該分離出來形成一個表(關(guān)聯(lián)),一般抽離出這一部分的主依賴項的id,把這一部分作為一個新的表記錄,同時原
29、表也存儲此次依賴項id,然后利用建立主外鍵關(guān)系,將一表分成兩表,解決原表因為主次依賴項存在而造成的數(shù)據(jù)冗余等一系列問題(但是對于以查詢操作為主、記錄大量數(shù)據(jù)的表此范式就需要斟酌了)。第二范式就是建立主鍵,與排除其他列對其屬性列的依賴(消除部分列的依賴)。2、 實體必須滿足第二范式。如果每個非鍵屬性描述的事實都與一個鍵屬性相關(guān),則實體滿足第三范式所有屬性描述的都必須是關(guān)于鍵的事實,除此之外別無其他。4nf,主要是解決根據(jù)屬性列的相似(不同的從屬對象)與共同(相同的從屬對象)信息的建表問題,即是表中所有列對外的一對多關(guān)系不受限制1、 因為比較抽象,即是a表中含有a1,a2兩個屬性列,b表中記錄a1
30、的信息(包含b1),c表中包含a2的信息(包含c1),但是b1,c1實際上是相同類型的信息,但是從對象不同。此處就是要我們明確建表的時候,要仔細區(qū)分共有與相似(決定建表)的關(guān)系,從屬對象與屬性列之間關(guān)系與一對多關(guān)系的搭設(shè)與否的問題。2、 在實體中,不會出現(xiàn)多于一個的多值依賴。5nf,主要是解決將信息切割得更細,清除所有冗余,但是在4nf設(shè)計會出現(xiàn)聯(lián)接不當(dāng)而產(chǎn)生的錯誤record1、在4nf下,一般我們僅僅是區(qū)分了屬性列的相似與共有信息,但是這個時候就會因為新建的b、c而產(chǎn)生誤解數(shù)據(jù)或者是錯誤記錄。因此可以從第五范式(實際上是所有范式)中得到的啟示是,當(dāng)你覺得可以將表分解為帶著不同自然鍵的更多、
31、更小的表時,這么干很可能就是最好的方式。如果你想要把各個部分聯(lián)結(jié)到一起,表示最初的、分解得更少的數(shù)據(jù)形式,數(shù)據(jù)庫干這事比你干得強多了。很明顯,如果你不能通過聯(lián)結(jié)來重新構(gòu)建分解前的表,那就最好不要進行分解。即是有一個道理,更少得冗余,更多的錯誤。唯有靠聯(lián)接來解決了。或者采用樹狀分層設(shè)計法,同層合并,也可以單獨建立一個事務(wù)記錄表。2、當(dāng)分解是信息無損的時候,所有關(guān)系都被分解成了二元關(guān)系。但是面對日益變態(tài)的信息幾何級的增長,為了令到數(shù)據(jù)庫從焦油坑變成金礦我們會加入數(shù)據(jù)挖掘的思想,但是這個時候就需要無損的信息與高度分塊的。所以在物理建表之前,我們還是需要遵循規(guī)范化建表的原則。20、規(guī)范化建表讓數(shù)據(jù)具有
32、原子性是設(shè)計出規(guī)范化數(shù)據(jù)表的第一步(同時也是為了提高數(shù)據(jù)庫的可讀性),但是到后期你可能會因為數(shù)據(jù)量以及性能的問題打破這種規(guī)范化。因為你的數(shù)據(jù)庫投入使用后數(shù)據(jù)庫的大小日益增大,設(shè)計規(guī)范化的表可以時刻保持你應(yīng)對以后各種復(fù)雜的組合查詢 (主要是應(yīng)對數(shù)據(jù)庫過分膨脹后的,查詢緩慢的問題)規(guī)范化建表的優(yōu)點:1、可以減少表中重復(fù)數(shù)據(jù)的存儲,減少數(shù)據(jù)庫的大??;2、因為數(shù)據(jù)庫的切割使得你的查詢的指向性更強,查找的數(shù)據(jù)少,查找得更加快速;3、但是最后歸根到底還是 避免存儲重復(fù)的數(shù)據(jù)節(jié)省我們的硬盤空間。21、不規(guī)范化建表規(guī)范化主要用來改善性能,過度規(guī)范化的結(jié)構(gòu)會造成查詢處理器和sql server中其他進程的開銷過
33、大(不適用在查詢表的設(shè)計),或者,有時需要降低復(fù)雜性來使得實現(xiàn)更容易些,非規(guī)范化在這些時候就會發(fā)揮作用。正如我在這章中一直試圖闡明的那樣,雖然人們大都認為非規(guī)范化到第三范式就可以了(靠著減少所需聯(lián)結(jié)的數(shù)量,查詢過程已經(jīng)被簡化了)然而,這樣做冒著引入數(shù)據(jù)異常的風(fēng)險。每個使用數(shù)據(jù)庫的應(yīng)用程序都要復(fù)制任何額外寫的,用來處理這些異常代碼,因此就增加了人為錯誤的可能性。在這種情況下必須作出的判斷是:是一個稍微慢點(但是100正確)的應(yīng)用更好呢,還是一個更快但正確性稍差的應(yīng)用更好些。在邏輯建模階段,絕不應(yīng)該從我們規(guī)范化的結(jié)構(gòu)倒退,對應(yīng)用程序過早過激地進行性能調(diào)優(yōu)工作。oltp數(shù)據(jù)庫結(jié)構(gòu)上,所以設(shè)計中最重要
34、的部分就是:保證我們的邏輯模型體現(xiàn)了最終的數(shù)據(jù)庫含有的所有實體和屬性。一旦開始物理建模過程(這與性能調(diào)優(yōu)應(yīng)該是同義語),那就有足夠充足的理由來對結(jié)構(gòu)進行非規(guī)范化操作,要么是出于性能的考慮,要么是出于減少復(fù)雜性的考慮,但是,這兩種考慮都不適合用在邏輯模型上。當(dāng)我們物理上的實現(xiàn)在邏輯上也正確的時候,碰到的問題幾乎總是會更少些。對幾乎所有情況來說,我都建議等到物理建模階段才對解決方案進行實現(xiàn),或者,至少等到有某種非做不可的原因時(比如,系統(tǒng)中某些部分失敗了)才進行非規(guī)范化工作??偨Y(jié):一般,我們是采用兩層數(shù)據(jù)庫的,一層是外層,用于直接的查詢。一層是內(nèi)層數(shù)據(jù)庫,用于記錄與維護更新的。維護更新資料的時候,
35、對內(nèi)層數(shù)據(jù)庫進行操作,當(dāng)操作完成的時候就會馬上更新外層數(shù)據(jù)庫。所以外層數(shù)據(jù)庫(以查詢?yōu)橹鳎┰O(shè)計的范式要求比較低,但是內(nèi)層數(shù)據(jù)庫(維護更新為主)的要求就比較高了。22、數(shù)據(jù)庫設(shè)計建議:數(shù)據(jù)庫不僅是用來保存數(shù)據(jù),還應(yīng)負責(zé)維護數(shù)據(jù)的完整性和一致性我看過很多的開發(fā)人員設(shè)計出來的數(shù)據(jù)庫,給我的感覺就是:在他們眼里,數(shù)據(jù)庫的作用就如同它的名稱一樣不僅僅是用來存放數(shù)據(jù)的,除了不得不建的主鍵以外,什么都沒有.沒有 check約束,沒有索引,沒有外鍵約束,沒有視圖,甚至沒有存儲過程。 一個很好的數(shù)據(jù)庫該有的還是有的。什么都沒有的數(shù)據(jù)庫插入操作是很好,但是多了這點東西的數(shù)據(jù)庫還是很快的。如果要寫代碼來確保表中的行
36、都是唯一的,就為表添加一個主鍵,即是distinct的使用頻率應(yīng)該是比價少的。 如果要寫代碼來確保表中的一個單獨的列是唯一的,就為表添加一個約束,一般是事務(wù)狀態(tài)記錄表。 如果要寫代碼確定表中的列的取值只能屬于某個范圍,就添加一個check約束。 如果要寫代碼來連接 父子 表,就創(chuàng)建一個關(guān)系,上下其實都是依據(jù)主外鍵的。 如果要寫代碼來維護“一旦父表中的一行發(fā)生變化,連帶變更子表中的相關(guān)行”,就啟用級聯(lián)刪除和更新。 如果要調(diào)用大量的join來進行一個查詢,就創(chuàng)建一個視圖。 如果要逐條的寫數(shù)據(jù)庫操作的語句來完成一個業(yè)務(wù)規(guī)則,就使用存儲過程。 沒有提到觸發(fā)器,實踐證明觸發(fā)器會使數(shù)據(jù)庫迅速變得過于復(fù)雜,
37、更重要的是觸發(fā)器難以調(diào)試,如果不小心建了個連環(huán)觸發(fā)器,就更讓人頭疼了,所以我更傾向于根本就不使用觸發(fā)器trigger。3、技術(shù)實例:(數(shù)據(jù)庫)1、 加載數(shù)據(jù)庫腳本source c:usersadministratordesktopscript-1.sql ;mysqlsource (.) execute an sql script file. takes a file name as an argument.2、 保存為數(shù)據(jù)庫腳本tee c:usersadministratordesktopscript-1.sql ;tee (t) set outfile to_outfile. append
38、 everything into given outfile.notee 輸入的時候就會把tee與notee進行保存為sql腳本。3、 查詢當(dāng)前實例的數(shù)據(jù)庫集合show databases ; mysqlmysql show databases;+-+| database |+-+| information_schema | drinks | mysql | performance_schema | test |+-+4、使用某個數(shù)據(jù)庫mysql use drinks;database changed5、查詢當(dāng)前數(shù)據(jù)庫的表集mysql show tables;+-+| tables_in_dr
39、inks |+-+| easy_drinks | my_contacts |+-+6、查詢表的結(jié)構(gòu)mysql desc my_contacts;+-+-+-+-+-+-+| field | type | null | key | default | extra |+-+-+-+-+-+-+7、判斷存在方法1:精確方法sysobjects是master系統(tǒng)視圖object_id是抓取對象在視圖中的idobjectproperty是根據(jù)對象判斷類型函數(shù),返回的是boolif exists (select * from dbo.sysobjects where id = object_id(ndbo
40、.tb) and objectproperty(id, nisusertable) = 1)drop table dbo.tb;方法2:模糊方法declare a varchar(2000) mssql 刪除約束set a=(select name from sysobjects where name like name) set a= alter table dbo.tablename drop constraint +a exec (a)8、數(shù)據(jù)庫的新建、刪、改新建數(shù)據(jù)庫mysql create database mydb; mysqlquery ok, 1 row affected (0
41、.00 sec)create database mmc; mssql數(shù)據(jù)庫修改exec sp_rename , name , database mssql刪除數(shù)據(jù)庫mysql drop database drinks;mysqlquery ok, 2 rows affected (0.34 sec)drop database mysql;mssql9、數(shù)據(jù)表的新建、刪、改 新建數(shù)據(jù)表mysql show create table servers;mysql顯示表的創(chuàng)建方式| servers | create table servers ( server_name char(64
42、) not null default , host char(64) not null default , db char(64) not null default , username char(64) not null default , password char(64) not null default , port int(4) not null default 0, socket char(64) not null default , wrapper char(64) not null default , owner char(64) not null default , prim
43、ary key (server_name) engine=myisam default charset=utf8 comment=mysql foreign servers table |mysql create table my_contacts( mysql- id int not null auto_increment, - last_name varchar(20) not null, - first_name varchar(20) not null, - email varchar(50) not null, - birthday date, - profession varcha
44、r(50), - location varchar(50), - status varchar(20), - interests varchar(20),- seeking varchar(100) ,parmary key (名 ) );create table article mssql( idint identity(1,1)not null,自增 title varchar(50)not null constraint uq_articletitle unique,1、唯一約束 keywordsvarchar(50)not null constraint ck_keywordsleng
45、th check (len(keywords)10),2、檢查約束 abstractvarchar(500)not null, 3、非空約束 author varchar(50)not null, typetinyintnot null default 0 constraint ck_articletype check(type in (0,1,2), isonindexbitnot null default 1, 默認值 contenttextnot null, sourcecodevarchar(100)null, sourcevarchar(50)not null default tra
46、cefact, srcurlvarchar(150)null, postdatedatetimenot null default getdate(), viewcountintnot null default 0, classidintnot null ,constraint pk_article primary key(id), 4、主鍵約束constraint fk_article foreign key(scoreid) references student(id)5、外鍵約束,為主表student建立外鍵關(guān)系)修改數(shù)據(jù)表 mysql alter table 舊表名 rename to
47、新表名; mysql use databasename; exec sp_rename 舊表名, 新表名;mssql刪除數(shù)據(jù)表mysql drop table mytables;mysqldrop table a1;mssql 10、字段、約束(數(shù)據(jù)表成員)的增加、刪、改增加字段mysql alter table mytablemysql 添加字段- add column mycolumn2 int first , 其中還有 after column 排在指定的列之后- add primary key (mycolumn2); mysql 添加主鍵alter table test1 add n
48、ob int identity(1,1) not null mssql 添加字段alter table test1 add primary key (nob); mssql 添加主鍵alter table dbo.article2 add default (1) for isonindex mssql添加默認約束alter table dbo.article2 with check add constraint ck_keywordslength2 check (len(keywords)(10) 新建checkalter table dbo.article2 check constraint
49、 ck_keywordslength2 mssql把ck_keywordslength2添加check約束集合alter table dbo.article2 with check add constraint ck_articletype2 check (type=(2) or type=(1) or type=(0)修改字段mysql alter table mytables - change column firstname firstname varchar(30) ,mysql 改變名字、類型- add primary key ( lastname );mysql alter tab
50、le mytablemysql 不改變名字,改類型- modify mycolumn2 varchar(20);exec sp_rename , name , column mssql 只改變名字alter table test1 alter column id varchar(200) null mssql 不改變名字,改類型alter table test1 drop constraint constraintname; mssql 刪除約束alter table test1 add primary key (nob); mssql 添加主鍵約束alter table ar
51、ticles2 add constraint fk_job_id foreign key (id) references article3(id); mssql添加外鍵約束alter table dbo.article2 add constraint uk_id unique nonclustered (id); mssql添加唯一約束alter table dbo.article2 add constraint uk_id default (1) for isonindex mssql添加默認約束alter table dbo.article2 with check add constrai
52、nt ck_keywordslength2 check (len(keywords)(10) 新建checkalter table dbo.article2 chenk constraint ck_keywordslength2 mssql把ck_keywordslength2添加check約束集合alter table dbo.article2 with check add constraint ck_articletype2 check (type=(2) or type=(1) or type=(0)alter table dbo.article2 with check add cons
53、traint ck_keywordslength2 check (len(keywords)(10) 新建checkalter table dbo.article2 check constraint ck_keywordslength2 mssql把ck_keywordslength2添加check約束集合備注:最后一欄column/database/index/object等等,還有約束的修改只能是先刪除再新建。還能夠建立聯(lián)合主鍵,就使用利用兩個字段來確定一條數(shù)據(jù),一般這樣的數(shù)據(jù)不會進行修改。刪除字段 mysql alter table mytable mysql - drop column mycolumn2; alter table tes
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度體育訓(xùn)練基地場地租賃合同8篇
- 2025年度智能家居解決方案區(qū)域代理銷售合同4篇
- 2025年度教育信息化設(shè)備采購合同書樣本模板4篇
- 文化交流活動合同
- 基于人工智能的智慧城市建設(shè)項目合同
- 2024年智能科技項目采購合同
- 2025年度土地流轉(zhuǎn)合同補充協(xié)議范本(農(nóng)業(yè)節(jié)水灌溉)
- 小區(qū)機電安裝合同
- 2025年度挖機駕駛員勞務(wù)派遣與績效評估合同
- 2025年汽車進出口貿(mào)易與物流服務(wù)合同2篇
- 冬春季呼吸道傳染病防控
- 中介費合同范本(2025年)
- 《kdigo專家共識:補體系統(tǒng)在腎臟疾病的作用》解讀
- 生產(chǎn)調(diào)度員崗位面試題及答案(經(jīng)典版)
- 【物 理】2024-2025學(xué)年八年級上冊物理寒假作業(yè)人教版
- 交通運輸安全生產(chǎn)管理規(guī)范
- 電力行業(yè) 電力施工組織設(shè)計(施工方案)
- 《法制宣傳之盜竊罪》課件
- 通信工程單位勞動合同
- 查對制度 課件
- 2024-2030年中國豬肉市場銷售規(guī)模及競爭前景預(yù)測報告~
評論
0/150
提交評論