     23 

     -  

    23.1.  

           
- ,       
    ,  :  
 -  ,    
,         . 
      - 
  GemStone (  Servio Corporation 
[23.2])     OPAL. .   OPAL,   
,       Smalltalk-80 (. [22.6, 23.1]). 
           ,  
 ,         
 . 

     

              
  5. 
               
    .     
(COURSE)        
(OFFERING).         (ENROLLMENT) 
  (TEACHER).  ,       
  . 
            : 

    EMPLOYEE ( #, ENAME, JOE ) PRIMARY KEY ( EMP* ) 
    COURSE ( COURSE*, TITLE ) 
    PRIMARY KEY ( COURSE* ) 
    OFFERING ( COURSE*, OFF*, ODATE, LOCATION ) PRIMARY KEY ( COURSE*, OFF* ) 
FOREIGN KEY ( COURSE* ) REFERENCES COURSE 
    ENROLLMENT ( COURSE*, OFF*, EMP#, GRADE ) PRIMARY KEY ( COURSE*, OFF*, 
EMP* ) FOREIGN KEY ( COURSE*, OFF* ) REFERENCES COURSE FOREIGN KEY ( EMP* ) 
REFERENCES EMPLOYEE 
    TEACHER ( COURSE*, OFF*, EMP* ) 
    PRIMARY KEY ( COURSE*, OFF#, EMP* ) 
    FOREIGN KEY ( COURSE*, OFF* ) REFERENCES OFFERING 
    FOREIGN KEY ( EMP* ) REFERENCES EMPLOYEE 

     . 23.1       .  
     5,      . 

     23,  - 	619 


    . 23.1,       
  


    23.2.   

             OPAL  
  .      
  EMPLOYEE (     ). 

    1	OBJECT SUBCLASS : 'EMPLOYEE1 
    2	INSTVARNAMES : # [ '?#', 'ENAME', 'JOB' ] 
    3	CONSTRAINTS : # [ #  f # EMP#, STRING ] , 
    4	[ # ENAME, STRING ], 
    5	[   #  JOB,   STRING  ]   ]    . 

    : 
        1    EMPLOYEE,   
  OBJECT. (   OPAL   1 
   OBJECT     SUBCLASS, 
    INSTVARNAMES  CONSTRAINTS    
.     (   )   
 ,) 
        2 ,    EMPLOYEE   
   #, ENAME  JOB. 
       3   #  :   
   STRING (  4  5   ). 
    .       ,  
       (,   
"#",     ). 
       COURSE: 

    OBJECT SUBCLASS : 'COURSE' 
    INSTVARNAMES : # [ 'COURSE*', 'TITLE', 'OFFERINGS' CONSTRAINTS : # ( #  [ 
# COURSE#, STRING ] , [ # TITLE, STRING ], [ # OFFERINGS, OSET] ] , 

    : 
      5   OFFERINGS,     
OSET , ,    OSET.1  , 
 OFFERINGS      

    1  ,    22,    
      OFFERINGS  REF(SET(REF(OFFERING))), 

    620  VI. -  

.  ,  -     
,       
 .   OSET   . 
       OFFERING: 
    1      OBJECT SUBCLASS : 'OFFERING' 
    2	INSTVARNAMES : # [ 'OFF#', 'ODATE', 'LOCATION1, 
    3	'ENROLLMENTS', 'TEACHERS' ] 
    4	CONSTRAINTS : # [ #  [ # OFF#, STRING ] , 
    5	[ # ODATE, DATETIME ], 
    6	[ # LOCATION, STRING ], 
    7	[ # ENROLLMENTS, NSET ], 
    8	[ # TEACHERS, TSET ] ] . 
    : 
        7   ENROLLMENTS,    
 NSET (,   ).  , 
 NSET      . , 
 TSET       . 
,     " ". 
  NSET  TSET   . 
       ,     OFFERING   
 " ",      COURSE.  
      .   
,          
 OFFERING    COURSE.   
    . 
       () ENROLLMENT: 
    1	OBJECT SUBCLASS : 'ENROLLMENT' 
    2	INSTVARNAMES : # [ 'EMP1, 'GRADE' ] 
    3	CONSTRAINTS  :#[#[# EMP, EMPLOYEE ] , 
    4	[ # GRADE, STRING ] ] . 
    '. 
         ENROLLMENT    " ", 
     OFFERING.    
,    ENROLLMENT     . 
,   ( 3)     
EMPLOYEE,   ,   . 

    .   " "   , 
  EMPLOYEE     ENROLLMENT.  
   :      
      --. 

       .     
          
  (TEACHER)    (EMPLOYEE). 
    1	EMPLOYEE SUBCLASS : 'TEACHER' 
    2	INSTVARNAMES : # [ 'COURSES' ] 
    3	CONSTRAINTS  :#[#[# COURSES, CSET ] ]. 
    '. 
        1   TEACHER,     
  EMPLOYEE ( , TEACHER "ISA" EMPLOYEE).  
,    TEACHER   #, ENAME  JOB 
(    EMPLOYEE),    COURSES,  
    CSET.   CSET  
  ,    . 

     23.  - 	621 

         22,  -   
     (). ,  
      
  (,  , ,   
..),     .      
  ,  : ESET, CSET, OSET, NSET  TSET. , 
  CSET       
  COURSE.      ,   
 ESET. 
    1      SET SUBCLASS      : 'ESET' 
    2	CONSTRAINTS : EMPLOYEE . 
    : 
        1    ESET,    
   SET. 
        2    ESET  :   
   ( )  EMPLOYEE.  
,       ESET,     
   ,      
   EMPLOYEE (    "  
").  ,  ESET  
-    EMPLOYEE   
  . 
       ,    ESET    . 
      CSET, OSET, NSET  TSET  (  
).         ,   
  . ,       
 OSET,     COURSE.   
  ""   . 

    SET SUBCLASS 
    CONSTRAINTS 
    SET SUBCLASS 
    CONSTRAINTS 
    SET SUBCLASS 
    CONSTRAINTS 
    SET SUBCLASS 
    CONSTRAINTS 
    'CSET' COURSE 
    'OSET' OFFERING 
    'NSET' ENROLLMENT 
    TEACHER 

     ,  . 23.2,       
  .        
  . 

    23.3.    

      ,     . 
        (, , 
, , ). 

     

             
EMPLOYEE   ESET.  ,      ESET. 

    DID OF SET OF ALL EMPS := ESET NEW . 

    622	 VI. -  

    SET SUBCLASS 
    CONSTRAINTS 
    SET SUBCLASS 
    CONSTRAINTS 
    SET SUBCLASS 
    CONSTRAINTS 
    SET SUBCLASS 
    CONSTRAINTS 
    SET SUBCLASS 
    CONSTRAINTS 
    OBJECT SUBCLASS 
    INSTVARNAMES CONSTRAINTS 
    OBJECT SUBCLASS 
    INSTVARNAMES CONSTRAINTS 
    OBJECT SUBCLASS 
    INSTVARNAMES 
    CONSTRAINTS 
    OBJECT SUBCLASS 
    INSTVARNAMES CONSTRAINTS 
    EMPLOYEE SUBCLASS 
    INSTVARNAMES CONSTRAINTS 
    'ESET' EMPLOYEE. 
    1CSET' COURSE. 
    'OSET' OFFERING. 
    'NSET' ENROLLMENT. 
    'TSET1 TEACHER. 
    'EMPLOYEE' 
    # [ 'EMP#', 'ENAME', 'JOB1 ] 
    # [ # [ # EMP#, STRING ] , [ # ENAME, STRING ], [ t JOB, STRING] ] . 
    : 'COURSE' 
    : ft [ ' COURSE*', ' TITLE', ' OFFERINGS' :#[#[# COURSE*, STRING ] , [ # 
TITLE, STRING ], [ ft OFFERINGS, OSET ] ] . 
    : 'OFFERING' 
    : # [ 'OFF*', 'ODATE', 'LOCATION', 
    'ENROLLMENTS', 'TEACHERS' ] 
    :#[#[# OFF#, STRING ] , 
    [ # ODATE, DATETIME ], [ # LOCATION, STRING ], t # ENROLLMENTS, NSET ], t 
# TEACHERS, TSET ] ] . 
    'ENROLLMENT' 
    # [ 'EMP', 'GRADE' ] 
    # [ # t t EMP, EMPLOYEE ] , [ # GRADE, STRING ] ] . 
    'TEACHER' 
    # [ 'COURSES' ] 
    # [ t [ # COURSES, CSET ] ]. 

    , 23.2,       
(- ) 

    : 
              (OID) 
    ESET (..    
  EMPLOYEE),       
  OID_OF_SET_OF_ALL_EMPS.  ,  
    "  ". 
            EMPLOYEE 
       ESET,  
    OID OF_SET_OF_ALL_EMPS.    
  EMPLOYEE        ESET 
   : 

    /* ! */ /*  */ 
    1 METHOD : ESET 
    2	ADD__EMP# : # _PARM 
    3	ADD_ENAME : ENAME_PARM 
    4	ADD_JOB : JOB_PARM 
    5	| EMPJDID | 
    6	EMPJDID := EMPLOYEE NEW . 
    7	EMPJDID SET_EMP# : EMP#_PARM , 
    8	SET ENAME : ENAME FARM 
    /*   /*  . */ /*  */ 
    

     23.  -  623 

    9	SET_JOB   :   JOB_PARM  . 
    10	SELF ADD :  EMPJDID  .                            /*  */ 
    11 % 

    '. 
        1     (   
"%"   11)    ESET. (      
         .) 
        2-4       ADD_EMP#, 
ADD_ENAME  ADD_JOB.      ,  
  .    EMP#_PARM, ENAME_PARM 
 JOB_PARM      . 
        5    EMP_OID,    6  
      
 EMPLOYEE. 
        7-9      EMPLOYEE  
   (SET_EMP#, SET_ENAME  SET_JOB)    
    (EMP#_PARM  SET_EMP#, ENAME_PARM  SET_ENAME  
JOB_PARM  SET_JOB). .  ,  SET_EMP#  
,      EMPLOYEE    
    #.    
SET_ENAME  SET_JOB.      . 
        10    SELF;    
,  ,        
 (..    -  
-).     ADD (   
   "" ).    , 
     EMP_O1D,    , 
   SELF. .  SELF 
 ,  ,  -  
 . 
       , ,       1, 
    .      OPAL 
   ,        (.. 
  ,    ,     
).          
 .      :    
          ,     
    . 
      ,         
 EMPLOYEE,    : 

    OID_OF_SET_OF_ALL_EMPS ADD_EMP#	:	'E0091 
    ADD_EME	:	'Watt1 
    ADD_JOB	:	'Janitor'   . 

            EMPLOYEE  
 009,          
   EMPLOYEE. 
     ,    NEW    
   EMPLOYEE,   ,    
    .       
    EMPLOYEE,      
"  ". .      

    624	 VI. -  

   ,  "    
   ",        
 . 
            
SET_EMP#, SET_ENAME  SET_JOB.     22,   
-       
        (), 
           ,  
  .      
""  v,       
    , GET_v  SET v,  GET_v 
    v, a SET_v  v  
,   . 

     

           , 
   " " (  
  /)      .  
       ,  
(        " ") 
    .      
    : 
    1.    NEW   CSET     
"  " (      
 COURSE). 
    2.         COURSE   
   "  ".     
      COURSE#  TITLE.  
,    NEW  OSET     
   (      
OFFERING), a        
  OFERINGS     COURSE. 
    3.           . 

     

        ,    : 
    1.         OFFERING.  
       OFF#, ODATE  
LOCATION       OFFERING   . 
 ,      . 
           ( 
 ENROLLMENT)    NEW   NSET,   
        
ENROLLMENTS    OFFERING. 
           ( 
 TEACHER)    NEW   NSET,   
        
TEACHERS    OFFERING. 
    2.          COURSES 
    : 
             COURSE, 
   OFFERING.    ,  

     23.  - 	625 

. . ,         
,        .   
       . 
         "  "    
 COURSE. 
            OFFERING  
 "  ". 
    ,  (     22)    
   ,  COURSES. ,  
        ,    
      . 
    3.   ,         
 . 
     ,  (     
 )     "  ".  
   ,       
 ,    "  ,  
 -",     . 

     

             
  ,   ENROLLMENT    EMPLOYEE, 
a   ,     
  EMPLOYEE.    
     : 
    1.           
ENROLLMENT.         
COURSES, OFF#, EMP#  GRADE       ENROLLMENT  
    GRADE.  ,   
  . 
        COURSES  OFF#    
OFFERING,     ENROLLMENT. 
        "  "    
 OFFERING. 
            ENROLLMENT  
 "  ". 
      ,     #   
  EMPLOYEE. 
          EMPLOYEE   
     ENROLLMENT. 
    2.           . 

     

             
  ,  TEACHER    EMPLOYEE.  
  ,      . 

    626	 VI. -  

    1.          TEACHER. 
        COURSES, OFF#  
#.     . 
         #   
  EMPLOYEE. 
         EMPLOYEE   TEACHER 
(        
).    /  
-     22. 
      ,     COURSES  OFF#  
   OFFERING,     TEACHER. 
        "  "    
 OFFERING. 
           TEACHER  
 "  ". 
    2.           
 ,     ,    
    COURSES     
TEACHER.      . 
    3.  ,         
 . 

      

         ,    
 -      
  . , ,      
       009   SQL: 

    INSERT INTO EMPLOYEE { EMP#, ENAME, JOB ) 
    VALUES ( VE009', 'Watt', 'Janitor' ) ; 
              : 
    INSERT  INTO COURSE   (  COURSE#,   TITLE  ) 
    
    VALUES   (   'C001',   'Database Technology1   )   ; 
    INSERT INTO OFFERING   (  COURSE*,   OFF#,   ODATE,   LOCATION  )	_, 
VALUES   (   'C001',   '004',   DATE  '94/01/18',   'CDG'   )   ;              
                               '* 
    INSERT  INTO ENROLLMENT   (  COURSE*,   OFF#,   EMP#,   GRADE   ) VALUES   
(   'C001',    '004',    'E009',   ''   )   ; 

     ,    ,    - 
  , ,      
   . 

    23.4.   

           ,  
,  (    )  OPAL,    
-   ,    
  ,   . ,   
      . 

     23,  - 	627 

         "     001, 
   -".   ,    
 OOSOAC,     "  
".      . 

    1	| COURSE_C001 , C001_OFFS , C001_NY_OFFS I 
    2	COURSE_C001 
    3	:= COSOAC DETECT : [ :CX | 'C001' = CX GET_COURSE# ] . 
    4	COOljDFFS 
    5	:= COURSE_C001 GET_OFFERINGS . 
    6	C001_NY_OFFS 
    7	:= COOljDFFS SELECT : [ :OX | 'New York1 = OX GET_LOCATION ] . 
    8	 C001_NY_OFFS . 

    : 
        1    : COURSE_COO 1,  
      001; C001_OFFS,  
     "  "  
 001;  , C001_NY_OFFS,      
     . 
         2  3   ,   
OOSOAC.      DETECT     
    [   : |  ()   ]. 
     ()   ,   ,     
,    ,     
DETECT (..   COURSE   ).  
  DETECT      
 ,    ()   (  
   001   COURSE).    
  COURSE   COURSE_C001. 
    .     DETECT     
   ,   ()   .  
    . 
         4  5  C001_OFFS   
"  "   1. 
       6  7   2  3,    SELECT 
  DETECT,   ,     
    (    
  ),    ()  .  
        
C001_NY_OFFS      
  001,    -. 
       ,   8    ( "" 
    ""  " "). 
          . 
    1.    SELECT  DETECT   (   ) 
    ,    
  AND, ..      . 
    2.   ,    SELECT  DETECT,  
  .       OPAL 
     (   
),         . 

    628	 VI. -  

    3.  ,   DETECT   " 
"      (), ,  
       OPAL   
(      ).  
      ,  "" 
,    () ,    
 . 
    4.         " 
DETECT", ,    ,    OPAL   . 
, DETECT  SELECT     (  
  " DETECT" ). ,     
    ( ) .   
        -  
  DETECT  SELECT (      
   ). 
    5.    ,    ,    
  " NEW".       
 .      OPAL   
 ,    - ,  -. 
          ,    
       (  OPAL 
   ).   OPAL     
  DO. ,      DO, 
      DETECT  SELECT   
 : 
     DO  :   [   : [  _ ]   ] 
           , 
  &,  _,   ,   
  .    GET_v  SET_v     
       (,  
,  ,       ). 
             
  IFTRUE  IFFALSE,   . 

    23.5.   

    -    FNSERT   
   ,     UPDATE   DELETE 
 . 

     

         ,   ,  
 ,    GET v   SET v. 

     

          REMOVE. ,  
        
.        , ..    
    ,    OPAL    
    " ".  
    "  001   
 ". 

    OID_OF SET_OF_ALL_EMPS 
    ""REMOVE : DETECT : [ :EX i  'Eooi' = EX GET EMP# ]. 

     23,  - 	629 

             DELETE 
CASCADE: ,        
   ?  , ,   
 . 
     ,     " " 
       
""  DELETE RESTRICTED,      
 ,     - .     
    . ,   
(OFFERING)       
(COURSE),      ""   . 
    (       
  ,   ,    
             , 
            . 
        " "    
.        .) 
      ,    REMOVE    
    DESTROY  SQL- DROP,   
   ENROLLMENT. 

    23.6.  

            OPAL,   
  Smalltalk-80,    GemStone.   
         
  OPAL.      ""  
,  EMPLOYEE,       
   ,     "", 
 ESET,         
     .     ,  
       ,    
  (,     )  
    . 
           . 
    ,     
 (,   ,   
- )     
 . (      
-   .)  
,    ""     
  ,      NEW.  ,   
     .  , 
  ,    -   "" 
     ,  ,     . 
        .  
-      
 ,   (   )    
  .  ,       
OPAL DETECT  SELECT,       . 
         .  
      ,   ,  

    630	 VI. -  

    GET_v   SET_v.    
   REMOVE     " 
" (    OPAL,   - 
       ).   
     . 
      
             
,   - . 
    	   . 
    1.	  ,   , 
    2.	  ,   . 
        ,      , .. 
     . ,    
,         
 .    ,   .  
        
 . 
    1.	  ,       . 
    2.	  ,   ""    . 
    3.	  ,       "". 
    4.	  ,       . 
     , ,       . 
,     ,      
 ,        ? (   
    24.) 
             
,      ENROLLMENT,    
     . 

    ENROLLMENT { COURSE, OFF#, EMP#, GRADE ) 

              
     .   
       (  
 ) .     
     .  , 
     ,   
          
 ""      "" 
 .  - , , 
   . 
       ,            
  ,   .    
    ?     
   ?      ? 
      -    
  . ,       
   ,     ENROLL, 
   : 

    ENROLL   .   OFFERING   .   COURSE   .   COURSES 

     23,  - 	631 

       -   
  (    ).  
 ,   ""    
      --.     
    , ..         
     . 
      ,   - , 
   ,    - 
,         
   OPAL.    ,       
      . ,  
   -,      
     .    
"- ",  , ,   
 ,   ,   
 , -,    .   
      . 

     

    23.1.   -   
        . .   
       . 23.2-23.4. 
    23.2.         
OPAL  -      . 
    23.3.     " " 
-      . 
    23.4.     OPAL      
 -      : 
    )       ; 
    )      . 
    23.5.      . ,  
      ,  , 
  ( ,        
OPAL  "  ").   , 
        . 
    23.6. ,    ,    
    -  . 
    ?     ? 
    23.7.     ,   ,  
    ,      
   ,    ,   
   ,     
         
.   -    ( 
     )? 

    632	 VI. -  


      

    23.1. Copeland G., Maier D. Making Smalltalk a Database System // Proc. 
1984 ACM SIGMOD Intern. Conf. on Management of Data. Boston, Mass., 1984. 
(: M. Stonebraker. Readings in Database Systems.  San Mateo, 
Calif.: Morgan Kauftnann, 1988.) 
          ,   
 Smalltalk-80 [22.6]    GemStone   OPAL. 
    23.2. Servio Corporation. GemStone Reference Manual.  Beaverton, Ore., 1990. 

        

    23.5.         
   .  ,   
  ,   ""      
 "      " (.. 
     ).   ,    X, 
     Y,     X.  
     Y,        
  X (      nil, .. 
 ).     ,  
         , 
     X,     ,   
. , ,     ESET.  
       ESET,   
   ESET       
 . 
    23.6.    : 
    S  (   ( J )	) 
    S  ( J  (  )	) 
      ( J  ( S )	) 
      ( S  ( J )	) 
    J  ( S  (  )	) 
    J  (   ( S )	) 
     -        
"    ",       
,     . 
    23.7.      ""   
.      : 
    S 	(  	( J ) ) 
    S 	( J 	(  ) ) 
    S 	(  ,	 J ) 
    S 	(  J,	  ) 
         ,   
"SP",     ,     
,       :   
,    . 
             "SP", "PJ"  "JS". 

     23.  - 	633 

