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最大,就把片段分配到哪個站點。