分布式數據庫設計


DDB設計的兩個問題

1)分段 – 分割關系成“段” ;邏輯上

2)分配 – 將段置放到站點 ;物理存儲上

• 目標 – 優化響應時間/吞吐量/費用/…

 

分段元則

假若有全局關系R 被分段為子關系(片段)集合,

 

– 完整性,分片之后,不能丟失元素

– 不相交性,每一個元素只能分配到唯一的一個分段

– 重構性,存在函數 g 使得 R = g(F1 , F2 , …, Fn )。

也就是通過分片,能夠還原出原來的數據總體

 

水平分段

把不同性質的元組,分割為不同的分段

基本水平分段

以關系E自身的屬性性質為基礎,執行“選擇”操作,將關系分割成若干個不相交的片段

例如:

對於學生表,根據班級編號這一性質,將學生元組分割多個片段。

 

如何選擇小項謂詞

什么小項謂詞?

 

 

 

 

 

小項謂詞就是划分條件的各種可能的組合,比如:

 

但是上面的小項謂詞,相當大一部分都是不符合語義的,因為沒有實際的數據對應這些小項謂詞。

還是回到剛才的那個問題:如何選擇小項謂詞集作為分段的依據呢?

 

仍然是以例子來說話:

 

應用a訪問Loc = Sa 的元組;應用b則訪問Loc = Sb的元組。

 

(1)不分段

(2)按照{Loc = sa,loc = sb}來分段,分兩段 

(3)按照{loc = sa,loc = sb,sal < 10}來分段,分4端;

 

 

 

 

只有一個分段的話,對一個特定的應用,分組內的元組選擇概率不相等,因此不好。比如:對於應用a,它只會選擇loc = sa的元組,而不選擇loc = sb的元組。元組選擇的概率不等,因此不好。

 

 

 

對於分成四個分段的方案,由於對於同一個應用,兩個分段選擇的概率是相等的,這樣也不好。

所以最理想的情形是:對每個特定的應用,最好能把它所要訪問的所有元組集中在一個分段,而且只是一個分段(小項性)

 

導出分段

從另一個關系的屬性性質或水平分段推導出來。

比如有選課表和學生表,

SC(S#, C#, GRADE)

S ( S#, SNAME. AGE, SEX)

按照學生表中的性別屬性,將SC表拆分成兩個分段,SC1,SC2,分別存儲的是男生和女生的選課信息。

 

一般如何來實現導出分段呢?半連接操作

 

 

也就是在連接操作的基礎上,進行投影操作,篩選出R的屬性。它的意義在於在R中篩選出能夠與S進行連接的元組而過濾出無用的元組。

以學生-選課表為例,先將學生表根據性別划分成兩個分段S1,S2,再讓SC分別與S1和S2進行半連接操作即可。

 注意:導出分段的完整性和不相交性不能得到保證,除非(學生表是導出表,選課表是被導出表):

1)導出屬性在導出表中是主鍵;

2)滿足引用約束(屬性如果存在於被導出表,則必須也存在於導出表);

 

垂直分段

通過“投影”操作把一個全局關系的屬性分成若干組 。垂直分段的基本目標是將使用頻繁的屬性聚集在一起。

垂直分段,保證重構性的方式就是在每個分段中都保留主關鍵字。這樣,通過自然連接操作可重構出原來的數據整體。

 

如何來進行垂直分段?

通過屬性的親和矩陣

 

 就是找出所有這樣的應用:它既訪問了判斷A1又訪問了片段A2,把他們的頻率之和相加。

要通過行列調整尋找分割點

 

 

混合分段

先水平分段,再垂直分段;

先垂直分段,再水平分段。

 

分配

在滿足用戶需求的前提下, 把設計好的數 據片段分配到相應的站點上存儲

 

 

分配的有關問題

查詢來源

 通訊費用? 結果大小, 關系,…

 存儲容量, 存儲費用? 分段大小?

 站點處理能力?

 查詢處理策略? – 連接操作算法 – 查詢結果收集站點

 

簡化模型如下:

 

讀的代價為:

 

 

寫代價:

 

存儲代價如下:

 

最后得目標函數:

 

要計算出這個目標函數的值,是一個NP難問題。

所以采用一個簡單的法則:盡可能將片段分配在被局部訪問位置,即盡量做到本地化的訪問。

 

最佳適應方法

 

充分考慮到了應用的訪問次數,哪個站點的B最大,就把片段分配到哪個站點。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM