(b) 位置透明性(级别2)
思考:
SUPPLIER 与 SUPPLY 都有更多的段? SUPPLIER1 与 SUPPLY2 或
SUPPLIER1 与 SUPPLY2 的结合不为空呢?
查询Q2:任意给一个零件号,求供应商名。并设分配模式为:
SUPPLIER1 为站点1 SUPPLY1 为站点3 SUPPLIER2 为站点2 SUPPLY2 为站点4
(3)系统具有本地映射透明性
Read(terminal,$PNUM); select SNUM into $SNUM from SUPPLY1 at site3
where PNUM = $PNUM; if # FOUND then begin
send $SNUM from site3 to site1; select NAME into $NAME
from SUPPLIER1 at site1 (程序员很聪明) where SNUM = $SNUM
end else begin
select SNUM into $SNUM
from SUPPLIER2 at site4 where PNUM = $PNUM; send $SNUM from site4 to site2; select NAME into $NAME
from SUPPLIER2 at site2
6
where SNUM = $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 = SC NSJ S1 站点1 SC2 = SC NSJ S2 站点2 SC3 = SC NSJ S3 站点3
模式C与D不分段,且重复地存放在2个站点上。 请分别在分段透明、位置透明、本地映射透明下完成: (1)把100号学生的奖学金增加50元。 (2)把6号与2号系学生的奖学金都加50元。 (3)学号为100的学生由2号系调入5号系的程序。
的程序。
分段透明:UPDATE S
SET 奖学金=奖学金+50 WHERE 学号=’100’;
位置透明:SELECT * FROM S1 WHERE 学号=’100’; IF # FOUND THEN
7
UPDATE S1
SET 奖学金=奖学金+50 WHERE 学号=’100’; ELSE BEGIN
SELECT * FROM S2 WHERE 学号=’100’; IF # FOUND THEN
UPDATE S2
SET 奖学金=奖学金+50 WHERE 学号=’100’;
ELSE
UPDATE S3
SET 奖学金=奖学金+50 WHERE 学号=’100’; END;
本地映射透明:
SELECT * FROM S1 AT SITE1 WHERE 学号=’100’; IF # FOUND THEN
UPDATE S1 AT SITE1 SET 奖学金=奖学金+50 WHERE 学号=’100’; ELSE BEGIN
SELECT * FROM S2 AT SITE2 WHERE 学号=’100’; IF # FOUND THEN
UPDATE S2 AT SITE2 SET 奖学金=奖学金+50 WHERE 学号=‘100‘; ELSE
UPDATE S3 AT SITE3
8
SET 奖学金=奖学金+50 WHERE 学号=‘100‘; END;
(2)把6号与2号系学生的奖学金都加50元。
分段透明:UPDATE S
SET 奖学金=奖学金+50
WHERE 系号=‘2‘ OR系号=‘6‘;
位置透明:UPDATE S2
SET 奖学金=奖学金+50; UPDATE S3
SET 奖学金=奖学金+50 WHERE 系号=‘6‘;
本地映射透明:
UPDATE S2 AT SITE2 SET 奖学金=奖学金+50; UPDATE S3 AT SITE3 SET 奖学金=奖学金+50 WHERE 系号=‘6‘;
(3)学号为100的学生由2号系调入5号系的程序。
分段透明:UPDATE S
SET 系号=’5’ WHERE 学号=’100’;
位置透明:
SELECT 姓名,年令,性别,奖学金,班长学号,民族INTO
$姓名,$年令,$性别, $奖学金, $民族 FROM S1
WHERE 学号=’100’;
SELECT 学号, 课号,成绩 INTO $SC(学号, 课号,成绩) FROM SC1
9
WHERE 学号=’100’;
DELETE SC1 WHERE 学号=’100’;(先删SC1,因为学号在该表中为外键) DELETE S1 WHERE 学号=’100’;(再删S1) INSERT INTO S2 (‘100‘,$姓名,$年令,$性别,
$奖学金, $民族)
INSERT INTO SC2 AS SELECT * FROM $SC 本地映射透明:
SELECT 姓名,年令,性别,奖学金,班长学号,民族INTO
$姓名,$年令,$性别, $奖学金, $民族 FROM S1 AT SITE1 WHERE 学号=’100’;
SELECT 学号, 课号,成绩 INTO $SC(学号, 课号,成绩) FROM SC1 AT SITE1 WHERE 学号=’100’;
DELETE SC1 AT SITE1 WHERE 学号=’100’; DELETE S1 AT SITE1 WHERE 学号=’100’;
INSERT INTO S2 AT SITE2(‘100‘,$姓名,$年令,$性别, $奖学金, $民族) INSERT INTO SC2 AT SITE2 AS SELECT * FROM $SC
设EMP有如下分段:
EMP1=PJEMPNUM,NAME,SAL,TAXSLDEPTNUM<=10(EMP) EMP2=PJEMPNUM,MGRNUM,DEPTNUMSLDEPTNUM<=10(EMP) EMP3=PJEMPNUM,NAME,DEPTNUM SLDEPTNUM>10(EMP) EMP4=PJEMPNUM,SAL,TAX MGRNUM SLDEPTNUM>10 (EMP)
Q3 100号雇员从3号部门调至15号部门。 分段透明:(注意:部门变了部门经理号也得变) SELECT MGRNUM INTO $MGRNUM FROM DEPT
WHERE DEPTNUM = 15;
10