Una relacin entre los niveles forman una jerarqua corresponde a una relacin binaria en el modelo entidad relacion. Por lo tanto, esta relacin se puede representar en la O modelo utilizando la cartografa tradicional para el binario -muchos a-uno relaciones. Para ello es necesario incluir en la tabla creada para el nivel secundario un atributo para la representacin de una clave primaria. Figura 1 incluye la jerarqua espacial ubicacin Geo que contiene el nivel del Estado y del Condado. Puesto que ya hemos creado una tabla para el Estado nivel, al lado definimos una tabla para el nivel de Condado:
Geometry mdsys.sdo geometry, Name varchar2(25), Population number(10), Area number, StateRef ref StateType); create table County of CountyType ( StateRef NOT NULL, constraint CountyPK primary key (Name), constraint CountyFK foreign key (StateRef) references State);
El objeto CountyType incluye una referencia (ref) tipo que puntero a la fila correspondiente en la tabla de estado. De esta manera, el enfoque o sustituye valuebased se une con acceso directo a las filas relacionadas utilizando los identificadores. Adems, no permitiendo que el atributo StateRef tener valores nulos y referencial hacer cumplir integridad limita asegurar que cada miembro del condado ha asignado un miembro de estado vlido. Sin embargo, para insertar datos en la tabla del Condado, los sustitutos de la miembros estatales correspondientes deben ser conocidos. a facilitar esta operacin se crea una vista que permite a introducir un nombre de estado en lugar de un sustituto del Estado:
create view CountyView (Geometry, Name, Population, Area, StateName) as select C.Geometry, C.Name, C.Population, C.Area, S.Name from County C, State S where C.StateRef = ref(S);
Desde las vistas definidas en dos tablas no se pueden actualizar, para insertar datos en la tabla usando el Condado CountyView, un lugar de gatillo deben crearse; que realiza acciones en lugar de la operacin especificadas en el gatillo. Adems, las relaciones topolgicas entre espacial niveles forman una jerarqua tambin deben ser considerados durante la aplicacin para evitar la inclusin de datos incorrectos y para indicar qu tipo de agregacin procedimientos deben ser desarrollados. Dos soluciones se puede proponer: (1) Restricciones en la geometra de el miembro de nio durante la operacin de insercin o (2) verificar las relaciones topolgicas entre lo geomtrico unin de las extensiones espaciales de miembros secundarios y la extensin espacial de su padre miembro asociado, despus de la insercin de todos los miembros secundarios. La primera solucin requiere la verificacin de la relacin topolgica entre extensiones espaciales de un condado y un miembros del estado: create or replace trigger CountySpaIns instead of insert on CountySpaView for each row declare StGeometry State.Geometry%Type; begin select S.Geometry into StGeometry from State S where S.Name = :new.StateName; if SQL%found then if sdo geom.relate(StGeometry,anyinteract, :new.Geometry,0.005) = TRUE then insert into County select :new.Geometry, :new.Name, :new.Population; :new.Area, ref(S) from State S where S.name = :new.StateName; else raise application error(-2002, Invalid Top. Rel.); end if; else raise raise application error(-2000, Invalid State Name: jj :new.StateName); end if; end; El disparador plantea errores si el nombre del estado no es vlido o si la geometra de un miembro de condado es disjunta de la geometra de su estado miembro correspondiente. De lo contrario, que inserta los nuevos datos en la tabla Condado. En el ejemplo, para comprobar las relaciones topolgicas que utilizar la funcin geom.relate sdo con una 'anyinteract' mscara, que acepta cualquier relaciones topolgicas pero disjuntos entre padres miembros infantil y. Sin embargo, una relacin topolgica especfico se puede utilizar en lugar de anyinteract, por ejemplo, cubre. En la segunda solucin nos permitimos incluir hijo miembros sin la activacin de un lugar de disparo. Despus todos los miembros secundarios se insertan, la verificacin de la relacin topolgica entre el geomtrica unin de las extensiones espaciales de miembros secundarios y la extensin espacial de su padre miembro asociado es realizado. Se da un ejemplo de esta verificacin siguiente. En primer lugar, se define una funcin que recibe un estado nombrar y devuelve 1 si la extensin espacial de un hecho Estado miembro es igual a la unin geomtrica de la extensiones espaciales de sus miembros County: create or replace function ChildrenWithinParent (StateName State.Name%Type) return Number is StName State.Name%type; begin select S1.Name into StName from State S1, (select S2.Name as SName, sdo aggr union(sdoaggrtype(C.Geometry, 0.005)) as Geometry from County C , State S2 where C.StateRef = ref(S2) group by S2.Name ) GU where S1.Name = StateName and GU.SName = S1.Name and sdo geom.relate(S1.Geometry, equal, GU.Geometry, 0.005)= equal; if SQL%found then return 1; else return 0; end if; end;
Utilizamos la funcin de unin aggr sdo, que devuelve un objeto espacial representada como la unin geomtrica de los objetos especificados espaciales, por ejemplo, los miembros del condado. Esta funcin funciona de manera similar a las funciones de agregado utilizado para los datos no espaciales, es decir, cuando el grupo de clusula est incluida y se selecciona la funcin especfica (por ejemplo, suma) con la diferencia de que se refiere a espacial datos. La instruccin de seleccin en la clusula from, crea una tabla temporal GU con dos atributos SName y Geometra. Esta ltima es la unin geomtrica de los condados agrupados por el nombre del estado. A continuacin, se utiliza esta tabla en el segundo, donde la declaracin para probar la igualdad de relacin topolgica. La funcin ChildrenWithinParent puede ser llamado para un estado especfico o para todos los estados. A continuacin, se muestra un ejemplo de esta convocatoria mostrando un mensaje en lugar de tomar alguna accin especfica: declare StName State.Name%type; cursor RetrieveState is select S.Name from State S; begin open RetrieveState; loop fetch RetrieveState into StName; exit when RetrieveState%notfound; if (ChildrenWithinParent (StName) = 1) then dbms output.put line(StName jj is totally covered by its counties); else dbms output.put line(StName jj is not totally covered by its counties); end if; end loop; close RetrieveState; end;