Modelar interfaces.

30/05/2004 - 11:30 por Carlos | Informe spam
Hola:

Estoy modelando una jerarquía de objetos e interfaces
sobre SQL Server pero no doy con la manera adecuada de
hacerlo. Expongo el problema con un ejemplo: Tengo una
jerarquía de clases. La clase base es "CAnimal", la cual
representa a un animal cualquiera. Por otro lado tengo dos
clases que heredan de "CAnimal" que son "CPerro"
y "CGato". Puedo representar en una base de datos los
objetos de estas clases mediante tres
entidades: "animal", "gato" y "perro"; cada una de ellas
con su tabla correspondiente de tal manera que las
entidades "perro" y "gato" tienen una clave externa a la
entidad "animal".

Ahora llegan las interfaces. Un "perro" implementa una
serie de interfaces: IOlfatea, ILadra, IEscarba. Un gato
implementa las inerfaces IMaulla, IGastaruñas, IRonrronea.
Si yo posteriormente heredo de "CGato" las
clases "CSiames" y "CAngora", estas a su vez heredan las
interfaces de Gato. Mi pregunta es: ¿Como modelo yo esta
la herencia e implementación de interfaces?.

Un saludo

Preguntas similare

Leer las respuestas

#6 Javier Loria
31/05/2004 - 16:36 | Informe spam
Me alegro mucho te sirviera.
Saludos,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

escribio:
Muchas gracias. Ha sido un ejemplo muy didactico.

Carlos
Bilbao, Spain

Hola:
Una idea:
==>> CREATE TABLE Clases(
NombreClase VARCHAR(30) NOT NULL
PRIMARY KEY
, NombreClaseBase VARCHAR(30) NULL
FOREIGN KEY REFERENCES Clases(NombreClase)
, CHECK(NombreClaseBase<>NombreClase)
)

CREATE TABLE Interfases(
NombreInterfase VARCHAR(30) NOT NULL
PRIMARY KEY
)

CREATE TABLE InterfasesImplementadas(
NombreClase VARCHAR(30) NOT NULL
FOREIGN KEY REFERENCES Clases(NombreClase)
, NombreInterfase VARCHAR(30) NOT NULL
, CONSTRAINT PK_Interfases
PRIMARY KEY (NombreClase, NombreInterfase)
)

INSERT Clases(NombreClase, NombreClaseBase)
SELECT 'CAnimal', NULL UNION ALL
SELECT 'CPerro' , 'CAnimal' UNION ALL
SELECT 'CGato' , 'CAnimal' UNION ALL
SELECT 'CSiames', 'CGato' UNION ALL
SELECT 'CAngora', 'CGato'

INSERT Interfases(NombreInterfase)
SELECT 'IOlfatea' UNION ALL
SELECT 'ILadra' UNION ALL
SELECT 'IEscarba' UNION ALL
SELECT 'IMaulla' UNION ALL
SELECT 'IGastaruñas' UNION ALL
SELECT 'IRonrronea'

INSERT InterfasesImplementadas(NombreClase, NombreInterfase)
SELECT 'CAnimal', 'IRespira' UNION ALL
SELECT 'CAnimal', 'ICamina' UNION ALL
SELECT 'CPerro', 'IOlfatea' UNION ALL
SELECT 'CPerro', 'ILadra' UNION ALL
SELECT 'CPerro', 'IEscarba' UNION ALL
SELECT 'CGato', 'IMaulla' UNION ALL
SELECT 'CGato', 'IGastaruñas' UNION ALL
SELECT 'CGato', 'IRonrronea'
==>> Esto debe estar normalizado a la 5ta regla formal y tiene 0
redundacia. Asume: NO HAY HERENCIA MULTIPLE.
Me inmagino que la parte que tienes problema es el obtener las
lista de las clases base o en este caso para CSiames -> CGato-
CAnimal.
Aqui tienes varias alternativas:
a) SELECT con cierta cantidad de niveles predeterminada. 4-5
Niveles Max.
b) SELECT Procedimiento/Funcion Anidado: Limite 32.
c) Estructuras y Jerarquias de CELKO: Ilimitado
d) Funciones Procedimental con ciclo: Ilimitado
La opcion D) que es popular seria mas o menos asi:
==>> CREATE FUNCTION ClasesBase (@NombreClase VARCHAR(30))
RETURNS @Bases TABLE(NombreClase VARCHAR(30) NOT NULL PRIMARY KEY )
AS
BEGIN
DECLARE @NumFilasAnterior INT
INSERT @Bases
SELECT NombreClase
FROM Clases
WHERE NombreClase=@NombreClase
SET @NumFilasAnterior=0
WHILE @NumFilasAnterior<(SELECT COUNT(*) FROM @Bases)
BEGIN
SELECT @NumFilasAnterior=COUNT(*) FROM @Bases
INSERT @Bases
SELECT NombreClaseBase
FROM Clases
JOIN @Bases AS B
ON Clases.NombreClase=B.NombreClase
LEFT JOIN @Bases AS Anteriores
ON Anteriores.NombreClase=Clases.NombreClaseBase
WHERE Anteriores.NombreClase IS NULL
AND NOT Clases.NombreClaseBase IS NULL
END
RETURN
END

==>> Ahora una consulta de las interfases implementadas por CAngora
seria: ==>> SELECT InterfasesImplementadas.NombreClase
, InterfasesImplementadas.NombreInterfase
FROM ClasesBase('CAngora') AS C
JOIN InterfasesImplementadas
ON C.NombreClase=InterfasesImplementadas.NombreClase
==>> La herencia multiple requiere una tabla mas y sacar
NombreClaseBase de la Tabla de Clases.
Espero te sirva,

Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Carlos escribio:
Hola:

Estoy modelando una jerarquía de objetos e interfaces
sobre SQL Server pero no doy con la manera adecuada de
hacerlo. Expongo el problema con un ejemplo: Tengo una
jerarquía de clases. La clase base es "CAnimal", la cual
representa a un animal cualquiera. Por otro lado tengo dos
clases que heredan de "CAnimal" que son "CPerro"
y "CGato". Puedo representar en una base de datos los
objetos de estas clases mediante tres
entidades: "animal", "gato" y "perro"; cada una de ellas
con su tabla correspondiente de tal manera que las
entidades "perro" y "gato" tienen una clave externa a la
entidad "animal".

Ahora llegan las interfaces. Un "perro" implementa una
serie de interfaces: IOlfatea, ILadra, IEscarba. Un gato
implementa las inerfaces IMaulla, IGastaruñas, IRonrronea.
Si yo posteriormente heredo de "CGato" las
clases "CSiames" y "CAngora", estas a su vez heredan las
interfaces de Gato. Mi pregunta es: ¿Como modelo yo esta
la herencia e implementación de interfaces?.

Un saludo





.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida