DEPT3=SLDEPTNUM>20(DEPT)
SUPPLIER1=SLCITY=’SF’(SUPPLIER)
SUPPLIER2=SLCITY=’LA’(SUPPLIER)
SUPPLY1=SUPPLYSJSNUM=SNUMSUPPLIER1
SUPPLY2=SUPPLYSJSNUM=SNUMSUPPLIER2
也可写成:
SUPPLY1=SUPPLYNSJSUPPLIER1
SUPPLY2=SUPPLYNSJSUPPLIER2
例子:
Q1:
任意给一个供应商号,求供应商名。
(1)系统具有分段透明性
Read(terminal,$SNUM);
selectNAMEinto$NAME
fromSUPPLIER
whereSNUM=$SNUM;
Write(terminal,$NAME);
站点1
DDBMS站点2
站点3
(a)分段透明性(级别1)
查询Q1:
任意给一个供应商号,求供应商名。
(2)系统具有位置透明性:
Read(terminal,$SNUM);
selectNAMEinto$NAME
fromSUPPLIER1
whereSNUM=$SNUM;
ifnot#FOUNDthen
selectNAMEinto$NAME
fromSUPPLIER2
whereSNUM=$SNUM;
Write(terminal,$NAME);
站点1
DDBMS站点2
或站点3
(b)位置透明性(级别2)
(3)系统具有本地映射透明性:
(加站点)
Read(terminal,$SNUM);
selectNAMEinto$NAME
fromSUPPLIER1ATSITE1
whereSNUM=$SNUM;
ifnot#FOUNDthen
selectNAMEinto$NAME
fromSUPPLIER2ATSITE3
whereSNUM=$SNUM;
Write(terminal,$NAME);
站点1
DDBMS站点2
站点3
(c)本地映射透明性(级别3)
图4.1分布透明性不同级别下的只读应用SUPINQUIRY
(4)无透明性
(2)较复杂的读应用(多表读)
查询Q2:
任意给一个零件号,求供应商名。
设分配模式为:
SUPPLIER1为站点1SUPPLY1为站点3
SUPPLIER2为站点2SUPPLY2为站点4
(1)系统具有分段透明性
Read(terminal,$PNUM);
selectNAMEinto$NAME
fromSUPPLIER,SUPPLY
whereSUPPLIER.SNUM=SUPPLY.SNUM
andSUPPLY.PNUM=$PNUM;
Write(terminal,$NAME);
(a)分段透明性(级别1)
查询Q2:
任意给一个零件号,求供应商名。
设分配模式为:
SUPPLIER1为站点1SUPPLY1为站点3
SUPPLIER2为站点2SUPPLY2为站点4
(2)系统具有位置透明性
Read(terminal,$PNUM);
selectNAMEinto$NAME
fromSUPPLIER1,SUPPLY1
whereSUPPLIER1.SNUM=SUPPLY1.SNUM;
andSUPPLY1.PNUM=$PNUM;
ifnot#FOUNDthen
selectNAMEinto$NAME
fromSUPPLIER2,SUPPLY2
whereSUPPLIER2.SNUM=SUPPLY2.SNUM;
andSUPPLY2.PNUM=$PNUM;
Write(terminal,$NAME);
(b)位置透明性(级别2)
思考:
SUPPLIER与SUPPLY都有更多的段?
SUPPLIER1与SUPPLY2或
SUPPLIER1与SUPPLY2的结合不为空呢?
查询Q2:
任意给一个零件号,求供应商名。
并设分配模式为:
SUPPLIER1为站点1SUPPLY1为站点3
SUPPLIER2为站点2SUPPLY2为站点4
(3)系统具有本地映射透明性
Read(terminal,$PNUM);
selectSNUMinto$SNUM
fromSUPPLY1atsite3
wherePNUM=$PNUM;
if#FOUNDthen
begin
send$SNUMfromsite3tosite1;
selectNAMEinto$NAME
fromSUPPLIER1atsite1(程序员很聪明)
whereSNUM=$SNUM
end
else
begin
selectSNUMinto$SNUM
fromSUPPLIER2atsite4
wherePNUM=$PNUM;
send$SNUMfromsite4tosite2;
selectNAMEinto$NAME
fromSUPPLIER2atsite2
whereSNUM=$SNUM
end
Write(terminal,$NAME);
(d)本地映射透明性(级别3)
图4.2分布透明性不同级别下的只读应用SUPOFPART
4.4更新应用的分布透明性
设有全局数据模型:
S(学号,姓名,年令,性别,系号,奖学金,民族)
C(课号,课名,学时,任课教师)
SC(学号,课号,成绩)D(系号,系名,系主任)
分段与分配模式为:
S1=SL系号=’2’S站点1
S2=SL系号=’5’S站点2
S3=SL系号’2’AND系号’5’S站点3
SC1=SCNSJS1站点1
SC2=SCNSJS2站点2
SC3=SCNSJS3站点3
模式C与D不分段,且重复地存放在2个站点上。
请分别在分段透明、位置透明、本地映射透明下完成:
(1)把100号学生的奖学金增加50元。
(2)把6号与2号系学生的奖学金都加50元。
(3)学号为100的学生由2号系调入5号系的程序。
的程序。
分段透明:
UPDATES
SET奖学金=奖学金+50
WHERE学号=’100’;
位置透明:
SELECT*FROMS1WHERE学号=’100’;
IF#FOUNDTHEN
UPDATES1
SET奖学金=奖学金+50
WHERE学号=’100’;
ELSE
BEGIN
SELECT*FROMS2WHERE学号=’100’;
IF#FOUNDTHEN
UPDATES2
SET奖学金=奖学金+50
WHERE学号=’100’;
ELSE
UPDATES3
SET奖学金=奖学金+50
WHERE学号=’100’;
END;
本地映射透明:
SELECT*FROMS1ATSITE1WHERE学号=’100’;
IF#FOUNDTHEN
UPDATES1ATSITE1
SET奖学金=奖学金+50
WHERE学号=’100’;
ELSE
BEGIN
SELECT*FROMS2ATSITE2WHERE学号=’100’;
IF#FOUNDTHEN
UPDATES2ATSITE2
SET奖学金=奖学金+50
WHERE学号=‘100‘;
ELSE
UPDATES3ATSITE3
SET奖学金=奖学金+50
WHERE学号=‘100‘;
END;
(2)把6号与2号系学生的奖学金都加50元。
分段透明:
UPDATES
SET奖学金=奖学金+50
WHERE系号=‘2‘OR系号=‘6‘;
位置透明:
UPDATES2
SET奖学金=奖学金+50;
UPDATES3
SET奖学金=奖学金+50
WHERE系号=‘6‘;
本地映射透明:
UPDATES2ATSITE2
SET奖学金=奖学金+50;
UPDATES3ATSITE3
SET奖学金=奖学金+50
WHERE系号=‘6‘;
(3)学号为100的学生由2号系调入5号系的程序。
分段透明:
UPDATES
SET系号=’5’
WHERE学号=’100’;
位置透明:
SELECT姓名,年令,性别,奖学金,班长学号,民族INTO
$姓名,$年令,$性别,$奖学金,$民族
FROMS1
WHERE学号=’100’;
SELECT学号,课号,成绩INTO$SC(学号,课号,成绩)
FROMSC1
WHERE学号=’100’;
DELETESC1WHERE学号=’100’;(先删SC1,因为学号在该表中为外键)
DELETES1WHERE学号=’100’;(再删S1)
INSERTINTOS2(‘100‘,$姓名,$年令,$性别,
$奖学金,$民族)
INSERTINTOSC2ASSELECT*FROM$SC
本地映射透明:
SELECT姓名,年令,性别,奖学金,班长学号,民族INTO
$姓名,$年令,$性别,$奖学金,$民族
FROMS1ATSITE1
WHERE学号=’100’;
SELECT学号,课号,成绩INTO$SC(学号,课号,成绩)
FROMSC1ATSITE1
WHERE学号=’100’;
DELETESC1ATSITE1WHERE学号=’100’;
DELETES1ATSITE1WHERE学号=’100’;
INSERTINTOS2ATSITE2(‘100‘,$姓名,$年令,$性别,$奖学金,$民族)
INSERTINTOSC2ATSITE2ASSELECT*FROM$SC
设EMP有如下分段:
EMP1=PJEMPNUM,NAME,SAL,TAXSLDEPTNUM<=10(EMP)
EMP2=PJEMPNUM,MGRNUM,DEPTNUMSLDEPTNUM<=10(EMP)
EMP3=PJEMPNUM,NAME,DEPTNUMSLDEPTNUM>10(EMP)
EMP4=PJEMPNUM,SAL,TAXMGRNUMSLDEPTNUM>10(EMP)
Q3100号雇员从3号部门调至15号部门。
分段透明:
(注意:
部门变了部门经理号也得变)
SELECTMGRNUMINTO$MGRNUM
FROMDEPT
WHEREDEPTNUM=15;
UPDATEEMP
SETDEPTNUM=15,MGRNUM=$MGRNUM
WHEREEMPNUM=100;
(a)分段透明性(级别1)
位置透明:
SELECTNAME,SAL,TAXINTO$NAME,$SAL,$TAX
FROMEMP1
WHEREEMPNUM=100;
SELECTMGRNUMINTO$MGRNUM
FROMDEPT2
WHEREDEPTNUM=15;
DELETEEMP1WHEREEMPNUM=100;
DELETEEMP2WHEREEMPNUM=100;
INSERTINTOEMP3(EMPNUM,SAL,TAX,DEPTNUM);
(100,$NAME,15);
INSERTINTOEMP4(EMPNUM,SAL,TAX,MGRNUM);
(100,$SAL,$TAX,$MGRNUM);
(b)位置透明性(级别2)
本地映射透明:
SELECTNAME,SAL,TAXINTO$NAME,$SAL,$TAX
FROMEMP1ATSITE1
WHEREEMPNUM=100;
SELECTMGRNUMINTO$MGRNUM
FROMDEPT2ATSITE2
WHEREEMPNUM=15‘;
DELETEEMP1ATSITE1WHEREEMPNUM=100;
DELETEEMP1ATSITE5WHEREEMPNUM=100;
DELETEEMP2ATSITE2WHEREEMPNUM=100;
DELETEEMP2ATSITE6WHEREEMPNUM=100;
INSERTINTOEMP3(EMPNUM,NAME,DEPTNUM);
ATSITE3:
(100,$NAME,15);
INSERTINTOEMP3(EMPNUM,NAME,MGRNUM);
ATSITE7:
(100,$NAME,15);
INSERTINTOEMP4(EMPNUM,SAL,TAX,MGRNUM);
ATSITE4:
(100,$SAL,$TAX,$MGRNUM);
INSERTINTOEMP4(EMPNUM,SAL,TAX,MGRNUM);
ATSITE8:
(100,$SAL,$TAX,$MGRNUM);
(C)本地映射透明性(级别3)
图4.2不同级别分布透明性下的更新应用。