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

#1 Miguel Egea
30/05/2004 - 20:48 | Informe spam
Bueno, los modelos relacionales no son modelos orientados a objetos, así que
tendrá que hacer un mapeo de cada entidad, o incluso de cada objeto derivado
a una o varias tablas según tus necesidades.

Una implementación podría ser una tabla para los datos comunes y otra para
cada uno de los particulares introduciendo las reglas de integridad
referencial necesarias. Por otra parte implementar las interfaces no tiene
por que suponer directamente que tengas que almacenar ninguna información,
si es así, podrás optar por varias alternativas de la misma forma.

Espero que te sirva..

-

Miguel Egea Gómez
Webmaster de PortalSQL

(lo de online sobra)

Microsoft SqlServer M.V.P.

Saludos
i
"Carlos" escribió en el mensaje
news:14f1c01c44628$b4233960$
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
Respuesta Responder a este mensaje
#2 Carlos
30/05/2004 - 23:42 | Informe spam
Ok... comprendo.

Pero has mencionado el tema de bases de datos orientadas a
objetos. Por lo que me han comentado no son muy eficientes
al día de hoy, de todas maneras otra pregunta... ¿Son las
bases de datos orientadas a objetos una manera de modelar
una base de datos o se emplean para ellas motores
completamente diferentes?... es decir ¿SQL Server
jamas podrá funcionar como base de datos orientada a
objetos?... si es así... ¿tiene microsoft alguna base de
datos orientada a objetos?..

Un saludo.

Bueno, los modelos relacionales no son modelos orientados


a objetos, así que
tendrá que hacer un mapeo de cada entidad, o incluso de


cada objeto derivado
a una o varias tablas según tus necesidades.

Una implementación podría ser una tabla para los datos


comunes y otra para
cada uno de los particulares introduciendo las reglas de


integridad
referencial necesarias. Por otra parte implementar las


interfaces no tiene
por que suponer directamente que tengas que almacenar


ninguna información,
si es así, podrás optar por varias alternativas de la


misma forma.

Espero que te sirva..

-


Miguel Egea Gómez
Webmaster de PortalSQL

(lo de online sobra)

Microsoft SqlServer M.V.P.

Saludos
i
"Carlos" escribió en el


mensaje
news:14f1c01c44628$b4233960$
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



.

Respuesta Responder a este mensaje
#3 Javier Loria
31/05/2004 - 01:51 | Informe spam
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
Respuesta Responder a este mensaje
#4 Miguel Egea
31/05/2004 - 06:08 | Informe spam
Bueno SQL-Server es relacional y seguirá siendolo, creo que además es lo
adecuado, ya que uno lo que realmente espera de una BBDD es que sea rápida.
En lo que seguramente se avance es en el mapeo, algún intento hay ya, aunque
creo que no se hará en la BBDD sino en la midle-tier.


-

Miguel Egea Gómez
Webmaster de PortalSQL

(lo de online sobra)

Microsoft SqlServer M.V.P.

"Carlos" escribió en el mensaje
news:151ec01c4468f$128a2ed0$
Ok... comprendo.

Pero has mencionado el tema de bases de datos orientadas a
objetos. Por lo que me han comentado no son muy eficientes
al día de hoy, de todas maneras otra pregunta... ¿Son las
bases de datos orientadas a objetos una manera de modelar
una base de datos o se emplean para ellas motores
completamente diferentes?... es decir ¿SQL Server
jamas podrá funcionar como base de datos orientada a
objetos?... si es así... ¿tiene microsoft alguna base de
datos orientada a objetos?..

Un saludo.

Bueno, los modelos relacionales no son modelos orientados


a objetos, así que
tendrá que hacer un mapeo de cada entidad, o incluso de


cada objeto derivado
a una o varias tablas según tus necesidades.

Una implementación podría ser una tabla para los datos


comunes y otra para
cada uno de los particulares introduciendo las reglas de


integridad
referencial necesarias. Por otra parte implementar las


interfaces no tiene
por que suponer directamente que tengas que almacenar


ninguna información,
si es así, podrás optar por varias alternativas de la


misma forma.

Espero que te sirva..

-


Miguel Egea Gómez
Webmaster de PortalSQL

(lo de online sobra)

Microsoft SqlServer M.V.P.

Saludos
i
"Carlos" escribió en el


mensaje
news:14f1c01c44628$b4233960$
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



.

Respuesta Responder a este mensaje
#5 Anonimo
31/05/2004 - 11:04 | Informe spam
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





.

Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida