關系型資料庫設計
『壹』 關系型資料庫和非關系型區別
一、特點不同
1、關系型資料庫:傳統的關系型資料庫採用表格的儲存方式,數據以行和列的方式進行存儲,要讀取和查詢都十分方便;關系型資料庫按照結構化的方法存儲數據;關系型資料庫採用結構化查詢語言(即sql)來對資料庫進行查詢。
2、非關系型資料庫:一個Hibari集群是一個分布式系統;個Hibari集群是線性可伸縮的;一個Hibari集群是高度可用;所有的更新都是持久的;所有的更新都是強一致性;所有客戶端操作是無鎖的。
二、功能不同
1、關系型資料庫:關系型資料庫十分強調數據的一致性,並為此降低讀寫性能付出了巨大的代價,雖然關系型資料庫存儲數據和處理數據的可靠性很不錯,但一旦面對海量數據的處理的時候效率就會變得很差,特別是遇到高並發讀寫的時候性能就會下降得非常厲害。
2、非關系型資料庫:可用於雲計算應用,如Web電子郵件、社交網路服務,以及其它日常需要儲存TB和PB級規模數據的服務。
三、應用領域不同
1、關系型資料庫:主要應用於計算機技術,例如在資料庫設計中,指定學生Sstudent,專指本科生。
2、非關系型資料庫:Hibari可用於雲計算環境中,例如 webmail、SNS 和其他要求T/P級數據存儲的環境中。Hibari 支持 Java, C/C++, Python, Ruby, 和 Erlang 語言的客戶端。
『貳』 資料庫設計的重要性
原創點經驗吧,好的資料庫設計有下面的一些作用,下面說的都是關系型資料庫。
1、首先充分體現系統的需求,資料庫是為應用服務的,好的資料庫設計應該首先能滿足應用系統的業務需求,准確的表達數據間關系。
2、保證數據的准確性和一致性,通過主外鍵、非空、限制、唯一索引等保證數據的健壯。
3、提高數據的查詢效率,通過合理表結構,安排物理存儲分區、增加索引等方式,提高數據的讀取速度,提高查詢效率。
4、有好的擴展性,在必要時能根據需求擴展數據結構。
『叄』 關系型資料庫中對於不確定屬性怎麼設計
紙上談兵,沒有結論,你這問題本身就有問題!
1、設計庫表時,各欄位屬性一定要確定
2、資料庫表欄位在確定後,一般不要進行屬性變更,很麻煩的!
你還是找個實際的資料庫實例來研究吧
『肆』 請大夥給我解釋一下資料庫設計的基本原則!
資料庫設計的三範式所謂範式,是關系型資料庫關系模式規范化的標准,從規范化的寬松到嚴格,分別為不同的範式,通常使用的有第一範式、第二範式、第三範式及BC範式等。範式是建立在函數依賴基礎上的。
函數依賴
定義:設有關系模式R(U),X和Y是屬性集U的子集,函數依賴是形為X→Y的一個命題,對任意R中兩個元組t和s,都有t[X]=s[X]蘊涵t[Y]=s[Y],那麼FD X→Y在關系模式R(U)中成立。X→Y讀作『X函數決定Y』,或『Y函數依賴於X』。通俗的講,如果一個表中某一個欄位Y的值是由另外一個欄位或一組欄位X的值來確定的,就稱為Y函數依賴於X。函數依賴應該是通過理解數據項和企業的規則來決定的,根據表的內容得出的函數依賴可能是不正確的。
第一範式(1NF)
定義:如果關系模式R的每個關系r的屬性都是不可分的數據項,那麼就稱R是第一範式的模式。
簡單的說,每一個屬性都是原子項,不可分割。1NF是關系模式應具備的最起碼的條件,如果資料庫設計不能滿足第一範式,就不稱為關系型資料庫。關系資料庫設計研究的關系規范化是在1NF之上進行的。
第二範式(2NF)
定義:如果關系模式R是1NF,且每個非主屬性完全函數依賴於候選鍵,那麼就稱R是第二範式。
簡單的說,第二範式要滿足以下的條件:首先要滿足第一範式,其次每個非主屬性要完全函數依賴與候選鍵,或者是主鍵。也就是說,每個非主屬性是由整個主鍵函數決定的,而不能由主鍵的一部分來決定。舉個例子:
有股票日行情表的主鍵是股 票代碼和交易日期組成。非主屬性中有收盤價和成交量等,都是由主鍵,即股票代碼和交易日期函數決定的,單獨的股票代碼或者交易日期都不能函數決定這些非主 屬性。如果這個表中有非主屬性股票簡稱,則股票簡稱是可以由股票代碼來函數決定的,這樣股票簡稱這個非主屬性就不是完全函數依賴於候選鍵,這樣的設計就不 滿足第二範式。
第三範式(3NF)
定義:如果關系模式R是2NF,且關系模式R(U,F)中的所有非主屬性對任何候選關鍵字都不存在傳遞依賴,則稱關系R是屬於第三範式。
簡單的說,第三範式要滿足以下的條件:首先要滿足第二範式,其次非主屬性之間不存在函數依賴。由於滿足了第二範式,表示每個非主屬性都函數依賴於主鍵。如果非主屬性之間存在了函數依賴,就會存在傳遞依賴,這樣就不滿足第三範式。
舉 個例子:在股票基本情況表中,主鍵是股票代碼,有非主屬性所屬一級行業和所屬二級行業。根據業務規則,所屬二級行業能夠函數決定所屬一級行業,這就表示存 在這樣一種關系:股票代碼函數決定所屬二級行業,所屬二級行業函數決定所屬一級行業,這就形成了傳遞依賴,這樣的設計就不符合第三範式。不過在實際運用 中,為查詢和使用的方便,有時也會違反第三範式。如上例,如果沒有所屬一級行業的屬性,需要查詢所屬一級行業的相關股票,需要查詢時使用函數來從二級行業 中函數生成所屬一級行業,使用性能上會受影響。所以通常會加上所屬一級行業的屬性。
BC範式(BCNF)
BC範式是第三範式的增強版,不過也有人說是直接從1NF發展過來的,即每個屬性,包括主屬性或非主屬性,都完全依賴於候選鍵,並且不存在傳遞依賴情況。
『伍』 設計關系資料庫,有點糾結,求教。
這其實是關系型資料庫設計的永恆話題,範式與反範式。
從一開始學關系型資料庫設計開始,老師就會對我們說在進行資料庫的表結構設計時,運用範式會有多麼重要的意義。確實,在實際工作當中你也會發現範式確實非常重要,但是隨著工作的深入。你會慢慢發現有時候遵守範式反而會讓你掉入一個又一個陷阱,於是我們又會談到一個反範式的概念,什麼時候需要遵守範式�什麼時候又需要反範式。
這個就要根據自己項目的業務、數據量來找到中間的平衡點。希望對你有幫助。
『陸』 關系型資料庫包含有哪些數據完整性約束在設計表時,什麼是主鍵,什麼是外鍵
是指資料庫中數據的正確性和相容性。資料庫完整性由各種各樣的完整性約束來保證,因此可以說資料庫完整性設計就是資料庫完整性約束的設計。
『柒』 請結合實例簡述進行適度關系型資料庫規范化是為了解決關系型資料庫的哪些問題
關系資料庫邏輯設計的好壞與所含的各個關系模式設計的好壞相關。如果各個關系模式結構合理、功能簡單明確、規范化程度高,就能確保所建立的資料庫具有較少的數據冗餘、較高的數據共享度、較好的數據一致性,並為資料庫系統能夠很好的應用於實際打下良好的基礎。
因此,關系的規范化理論就是為解決數據冗餘、刪除異常和插入異常等問題而提出來的。
(7)關系型資料庫設計擴展閱讀:
一個關系模式接著分解可以得到不同關系模式集合,也就是說分解方法不是惟一的。最小冗餘的要求必須以分解後的資料庫能夠表達原來資料庫所有信息為前提來實現。其根本目標是節省存儲空問,避免數據不一致性,提高對關系的操作效率,同時滿足應用需求。
實際上,並不一定要求全部模式都達到BCNF不可。有時故意保留部分冗餘可能更方便數據查詢。尤其對於那些更新頻度不高,查詢頻度極高的資料庫系統更是如此。
『捌』 什麼叫關系型資料庫
關系型資料庫,是指採用了關系模型來組織數據的資料庫,其以行和列的形式存儲數據,以便於用戶理解,關系型資料庫這一系列的行和列被稱為表,一組表組成了資料庫。
用戶通過查詢來檢索資料庫中的數據,而查詢是一個用於限定資料庫中某些區域的執行代碼。
關系模型可以簡單理解為二維表格模型,而一個關系型資料庫就是由二維表及其之間的關系組成的一個數據組織。
(8)關系型資料庫設計擴展閱讀:
關系型資料庫特點:
1、存儲方式:傳統的關系型資料庫採用表格的儲存方式,數據以行和列的方式進行存儲,要讀取和查詢都十分方便。
2、存儲結構:關系型資料庫按照結構化的方法存儲數據,每個數據表都必須對各個欄位定義好,再根據表的結構存入數據,這樣做的好處就是由於數據的形式和內容在存入數據之前就已經定義好了,所以整個數據表的可靠性和穩定性都比較高。
3、存儲規范:關系型資料庫為了避免重復、規范化數據以及充分利用好存儲空間,把數據按照最小關系表的形式進行存儲,這樣數據管理的就可以變得很清晰、一目瞭然,當然這主要是一張數據表的情況。
4、擴展方式:由於關系型資料庫將數據存儲在數據表中,數據操作的瓶頸出現在多張數據表的操作中,而且數據表越多這個問題越嚴重,如果要緩解這個問題,只能提高處理能力,也就是選擇速度更快性能更高的計算機。
5、查詢方式:關系型資料庫採用結構化查詢語言來對資料庫進行查詢,SQL早已獲得了各個資料庫廠商的支持,成為資料庫行業的標准,它能夠支持資料庫的CRUD操作,具有非常強大的功能,SQL可以採用類似索引的方法來加快查詢操作。
6、規范化:在資料庫的設計開發過程中開發人員通常會面對同時需要對一個或者多個數據實體進行操作,這樣在關系型資料庫中,一個數據實體一般首先要分割成多個部分,然後再對分割的部分進行規范化,規范化以後再分別存入到多張關系型數據表中,這是一個復雜的過程。
7、事務性:關系型資料庫強調ACID規則(原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)),可以滿足對事務性要求較高或者需要進行復雜數據查詢的數據操作,而且可以充分滿足資料庫操作的高性能和操作穩定性的要求。
8、讀寫性能:關系型資料庫十分強調數據的一致性,並為此降低讀寫性能付出了巨大的代價,雖然關系型資料庫存儲數據和處理數據的可靠性很不錯,但一旦面對海量數據的處理的時候效率就會變得很差,特別是遇到高並發讀寫的時候性能就會下降的非常厲害。
9、授權方式:關系型資料庫常見的有 Oracle,SQLServer,DB2,Mysql,除了Mysql大多數的關系型資料庫如果要使用都需要支付一筆價格高昂的費用,即使是免費的Mysql性能也受到了諸多的限制。
『玖』 什麼是關系型資料庫
關系型資料庫,是指採用了關系模型來組織數據的資料庫,其以行和列的形式存儲數據,以便於用戶理解,關系型資料庫這一系列的行和列被稱為表,一組表組成了資料庫。
用戶通過查詢來檢索資料庫中的數據,而查詢是一個用於限定資料庫中某些區域的執行代碼。關系模型可以簡單理解為二維表格模型,而一個關系型資料庫就是由二維表及其之間的關系組成的一個數據組織。
關系型資料庫設計的過程可大體分為四個時期七個階段。
存儲結構:關系型資料庫按照結構化的方法存儲數據,每個數據表都必須對各個欄位定義好(也就是先定義好表的結構),再根據表的結構存入數據,這樣做的好處就是由於數據的形式和內容在存入數據之前就已經定義好了,所以整個數據表的可靠性和穩定性都比較高,但帶來的問題就是一旦存入數據後,如果需要修改數據表的結構就會十分困難。
(9)關系型資料庫設計擴展閱讀:
關系型資料庫相比其他模型的資料庫而言。有著以下優點:
1、容易理解:關系模型中的二維表結構非常貼近邏輯世界,相對於網狀、層次等其他模型來說更容易理解。
2、使用方便:通用的SQL語言使得操作關系型資料庫非常方便,只需使用SOL語言在邏輯層面操作資料庫,而完全不必理解其底層實現。
3、易於維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大降低了數據冗餘和數據不一致的概率。
『拾』 如何自己實現一個關系型資料庫
對外數據模型為關系型資料庫,內部的實現主要分成兩大類,一類是disk-based,比如mysql,postgres,一類是memory based,後者包括MemSQL,SAP HAHA,OceanBase。看題目的意思指的是前者。這里說一個disk-based的關系型資料庫涉及多少東西。
上世紀70/80年代內存不大,數據不能都放在內存里,大部分數據都存在磁碟上,讀數據也需要從磁碟讀,然而讀寫磁碟太慢了,所以就在內存里做了一個buffer pool,將已經讀過的數據緩存到buffer pool中,寫的時候也是寫到buffer pool中就返回,buffer pool的功能就是管理數據在磁碟和內存的移動。在buffer pool中數據的管理單位是page。page大小一般幾十KB。一般都可以配置。如果buffer pool中沒有空閑的page,就需要將某一個page提出buffer pool,如果它是dirty page,就需要flush到磁碟,這里又需要一個LRU演算法。一個page包含多條記錄,page的格式需要設計用來支持變長欄位。如果這時宕機了,buffer pool中的數據就丟了。這就需要REDO log,將對數據的修改先寫到redo log中,然後寫buffer pool,然後返回給客戶端,隨後,buffer pool中的dirty page會被刷到數據文件中(NO FORCE)。那麼重啟的時候,數據就能從redo log中恢復。REDO log還沒刷完就刷數據到磁碟可以加快寫入速度,缺點就是恢復的時候需要回放UNDO log,回滾一些還沒有提交的事務的修改。寫log又分為邏輯log和物理log,還有物理邏輯log。簡單說邏輯log就是記錄操作,比如將某個值從1改成2.而物理log記錄具體到record的位置,例如某個page的某個record的某個field,原來的值是多少,新值是多少等。邏輯log的問題是並發情況下不太好恢復成一致。物理log對於某些操作比如create table又過於瑣碎,所以一般資料庫都採用混合的方式。為了跟蹤系統中各種操作的順序,這就需要為log分配id,記做LSN(log sequence number)。系統中記錄各種LSN,比如pageLSN, flushedLSN等等。為了加快宕機恢復速度,需要定期寫checkpoint,checkpoint就是一個LSN。
以上ACID里的C和D有關。下面說A和I,即原子性和隔離性。
這兩個性質通過concurrency control來保證。隔離級別有很多種,最開始有4種,從低到高read uncommitted, read committed, repeatable read, serializable。serializable就是多個事務並發執行的結果和某種順序執行事務的結果相同。除了serializable,其他都有各種問題。比如repeatable read有幻讀問題(phantom),避免幻讀需要gap lock。read committed有幻讀和不可重復讀問題。後來又多了一些隔離級別,比如snapshot isolation,snapshot isolation也有write skew問題。早期,並發控制協議大多是基於兩階段鎖來做的(2PL),所以早期只有前面提到的四種隔離級別,後來,又出現一類並發控制協議,統稱為Timestamp Ordering,所以又多了snapshot isolation等隔離級別。關於隔離級別,可以看看這篇論文 http://research.microsoft.com/pubs/69541/tr-95-51.pdf。2PL需要處理deadlock的問題。
Timestamp Ordering大體的思想就是認為事務之間沖突不大,不需要加鎖,只在commit的時候check是否有沖突。屬於一種樂觀鎖。
Timestamp Ordering具體來說包括多種,最常見的MVCC就是這類,還有一類叫做OCC(optimistic concurrency control)。MVCC就是對於事務的每次更新都產生新的版本,使用時間戳做版本號。讀的時候可以讀指定版本或者讀最新的版本。幾乎主流資料庫都支持MVCC,因為MVCC讀寫互相不阻塞,讀性能高。MySQL的回滾段就是用來保存老的版本。MVCC需要有後台線程來做不再需要的版本的回收工作。Postgres的vacuum就是做這事的。OCC和MVCC的區別是,OCC協議中,事務的修改保存在私有空間(比如客戶端),commit的時候再去檢測沖突,通常的做法是事務開始時看一下自己要修改的數據的最後一次修改的時間戳,提交的時候去check是否這個時間戳變大了,如果是,說明被別人改過了,沖突。沖突後可以回滾或者重試。
上面這些搞定了就實現了資料庫的核心,然後為了性能,需要index,通常有兩種,一種支持順序掃描B+Tree,還有一種是Hash Index。單條讀適合用Hash Index,O(1)時間復雜度,順序掃描只適合用B+Tree,O(logN)復雜度。然後,有些查詢只需要掃描索引就能得到結果,有些查詢直接掃描數據表就能得到結果,有些查詢可以走二級索引,通過二級索引找到數據表然後得到結果。。具體用哪種方式就是優化器的事了。
再外圍一些,關系型資料庫自然需要支持SQL了,由SQL變成最後可以執行的物理執行計劃中間又有很多步,首先SQL通過詞法語法分析生成抽象語法樹,然後planner基於這棵樹生成邏輯執行計劃,邏輯執行計劃的生成通常涉及到等價謂詞重寫,子查詢消除等邏輯層面的優化技術,優化的目的當然是性能。比如等價謂詞重寫,用大於小於謂詞消除like,between .. and..等不能利用索引的謂詞。下一步是邏輯執行計劃生成物理執行計劃,物理執行計劃樹每個節點是一個operator,operator的執行就是實實在在的操作,比如掃表的operator,filter opertor。一個邏輯執行計劃通常可以有多個物理執行對應,選擇哪個就涉及到物理執行計劃優化,這里涉及到經典的cost model,綜合考慮內存,CPU, I/O,網路等。最典型的,三表join,從左到右還是右到左,使用hash join,還是sort merge join等。