entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

3votos

Implementar Herencia en Mysql Workbench, es posible?

Hola a todos,

Quisiera preguntar si es posible implementar una herencia dibujando el diagrama EER en Mysql Workbench, donde por ejemplo exista un usuario que posea identificación, nombre y contraseña, y exista un estudiante que posea el pregrado que está cursando, la universidad donde la estudia... etc.. (cualquier información además.) y este estudiante pueda ser un usuario; por otro lado suponer que exista un profesor que posea un grupo de investigación al que pertenece, un tiempo de vinculación.. entre otros datos y este profesor también pueda ser un usuario, para que ambos (Estudiante y Profesor) hereden los datos de Usuario.

Cómo es posible representar este diagrama EER implementando la herencia en Mysql Workbench? he leído por ahí que Mysql no soporta herencia, pero algunas personas han tratado de implementarla.

Entonces, esto sería posible? cómo podría hacerlo?

Mcuhas gracias por su atención y colaboración prestada.

----------- ACTUALIZACIÓN ----------------------

El problema que deseo resolver es el caso de un login del sistema, donde no tenga que redudar datos para los usuarios, en mi problema existen 3 tipos de usuarios

  1. Estudiante
  2. Docente
  3. Administrador

Cada uno tiene información propia de su rol, pero además comparten la información para el ingreso al sistema, como lo es:

  • Identificación
  • Contraseña

Entonces deseo que en la base de datos no se almacene información redudante o que pueda ser utilizada por otras tablas y no se esté haciendo así.

3 Respuestas

2votos

Leonardo-Tadei Puntos227320

Uy, uy, uy... plantear herencia en los almacenamientos suele significar que estás modelando mal, porque las jerarquías de clases deben especializarse por comportamiento y no por estructura.

El problema del Estudiante-Profesor-AyudanteAlumno está además muy analizado como ejemplo de esto.

en tu caso, bastaría que tanto Estudiante como Profesor tengan por composición al Usuario para usarlo, con lo que no hace falta ninguna herencia, cosa que además no reflejaría la realidad porque el comportamiento del Estudiante y del Profesor en el sistema debe ser bien distinto.

Luego depende del lenguaje, pero si usás alguno que tenga un ORM decente, incluso no haría falta pensar en las tablas a la hora de escribir el código (solo un rato al momento de hacer los mapeos)

Saludos cordiales!

0voto

dairon comentado

a mi particularmente me gusta hacer las relaciones sin pensar en nada de herencia sino en relaciones a travez de id o nombres de tablas de tal forma que la informacíon sea rápida, fluida y sin duplicaciones imnecesarias.
Pero bueno estoy aprendiendo aún. Saludos

0voto

Leonardo-Tadei comentado

Lo que pasa es que entre el almacenmiento relacional y la POO hay un desajuste por impedancia de modelos, es decir, no hay como convertir un modelo en otro ni viceversa.

En los lenguajes de Objetos puros, como Smalltalk, esto no es ningún problema, porque el ambiente se encarga de persistir los Objetos, pero si un software OO quiere persistir sus Objetos en un RDBMS, hay que abordar algún mecanismo de conversión.

http://revistatelematica.cujae.edu.cu/index.php/tele/article/viewFile/23/21

Lo importante al adoptar algún mecanismo es, en lo posible, no violar las reglas ni de la normalización ni de la POO... sin embargo, a veces es necesario hacer concesiones. Llegados a este punto, creo que requiere manejar muy bien los dos paradigmas para saber qué concesiones hacer y dónde, ya que de otra forma para algo a mi pesar bastante habitual, que es ver a gente modelando problemas en POO pero luego comprobar que sus Objetos están modelados en base al paradigma Entidad/Relación.

Saludos!

DAO significa: Desde Ahora Olvídenlos ;-)

0voto

dairon comentado

Meastro @Leonardo-Tadei el Zope utiliza un gestor de base de datos Orientado a Objetos como usted menciona??

0voto

Leonardo-Tadei comentado

No, de hecho lo que hace es violar el paradigma de POO.

Por un lado, Python no define atributos de visibilidad salvo como convenciones, es decir, que no existen atributos privados, con lo que se viola el principio de encapsulamiento.

Por otro, Zope maneja la persistencia con ZODB, que requiere que las clases que persistan del modelo hereden de persistent.Persistent, con lo que se pervierte el diseño y la jerarquía de clases del Modelo. Esto además impide cosas como obtener certificaciones sobre un modelo, porque los test en vez de aplicarse solo sobre él, ahora deben también aplicarse sobre las clases del ORM.

Uno puede asumir esto como el "costo de la hibridación" y no está mal... lo que estaría bueno es que haya ORM mejores que no violen el paradigma de la POO.

Saludos!

0voto

dairon comentado

Gracias por la aclaración Maestro.
saludos

0voto

admont28 comentado

Hola a todos, primero que todo gracias por responder a todos.

No me queda muy claro la solución que me brindas @Leonardo-Tadei, el lenguaje es PHP y no estoy usando ningún framework u ORM, lo estoy haciendo desde cero, así que por eso construyo el diagrama EER en Mysql Workbench, me podrías dar si no es mucha molestia un ejemplo más visual?

Muchas gracias!! Saludos!! :)

0voto

dairon comentado

no creo que lo más optimo sea hacerlo en php solamente

0voto

admont28 comentado

Hola @dairon que me aconsejas para este caso?

Gracias.

0voto

dairon comentado

Te aconsejo que sigas el consejo generalizado que todos te hemos dado aqui. Investiga las ventajas de cada plataforma, arquitectura y lenguaje de programacion. Define bien lo que quieres y que tecnologías utilizarías y entonces decidiras que lenguaje usar en cada caso pues puedes utilizar diferentes lenguajes y hacer pasarela de datos por curl o REST con json que es casi universal. Solo es mi criterio. siempre una buena investigación para que avances muchos más rápido a la hora de lai mplementación.
Saludos

0voto

Leonardo-Tadei comentado

El lenguaje da lo mismo, al menos desde el punto de vista del modelo relacional para hacer bien el almacenamiento.

Luego, un lenguaje que manejás bien es importante, pero también lo es el tipo de problema a resolver, y de eso no sabemos nada :-(

0voto

admont28 comentado

oh que pena @Leonardo-Tadei, no expresé bien el problema a resolver, estoy actualizando la pregunta, y en cuanto al lenguaje lo hago en PHP porque con el es que he tenido experiencia.

Gracias...

0voto

Leonardo-Tadei comentado

Hola @admont28,

no sé si puedo darte un ejemplo más visual, porque estamos hablando de un problema en abstracto...

Respecto de escribir todo desde cero, es una cuestión que tal vez quieras reveer, en el sentido que así como es muy probbable que uses JQuery para no tener que escribir toda la capa de interacción con el usuario desde cero en JavaScript, podrías usar algún ORM para PHP para no tener que escribir desde cero un repositorio virtual para que los objetos de tu Modelo persistan.

Ya habíamos comentado por acá sobre este ORM en PHP que es Software Libre: https://github.com/PegasusTech pero hay otras alternativas y en gran parte depende de con qué paradigma d eprogramación vayas a resolver el problema.

Yo en lo que incisto es que un almacenamiento relacional debe estar normalizado al menos en 3FN... lo demás puede que sea opinable.

Seguimos!

0voto

admont28 comentado

Muchas gracias @Leonardo-Tadei, pero me estoy confundiendo mucho con todo esto, mi pregunta sería: que solución me puedes brindar para el problema que plantee en la pregunta principal? independiente del lenguaje que use o el ORM... me interesaría conocer sólo la solución en cuanto al diagrama EER se refiere.

Saludos! y que pena hacer tan extensa la pregunta, pero no he podido solucionar mi problema. :(

0voto

Leonardo-Tadei comentado

Cuando aplicás la 3FN a tu problema, las tablas quedarían así:

Usuario
-----------
id
nom
pas

Docente
------------
id
ape
nom
...
id_usuario

Estudiante
---------------
id
ape
nom
matricula
...
id_usuario

Administrador
-------------------
id
ape
nom
rol
...
id_usuario

Inventé datos y estoy asumiendo por tu pregunta que los datos del login serán parte del software y cualquier otra de las formas de loguear a un usuario que existen.

Al aplicar la Normalización, resulta que los datos de login no dependen únicamente de la clave primaria, y por tanto pasan a otra tabla para quedar en 3ra forma normal.

Saludos!

2votos

white Puntos75880

Mysql no soporta herencia al ser relacional, y en Mysql Workbench no es posible mostrarlo visualmente.

La herencia se podría implementar de algunas formas, como usar una clase padre ( usuario ) y sub-clases (estudiante, profesor)

En estudiante y profesor se agrega una llave foreana de relacion con la llave primaria de usuario.

CREATE TABLE estudiante(
    estudiante_id int,
    PRIMARY KEY(estudiante_id),
    FOREIGN KEY (estudiante_id) REFERENCES usuario(usuario_id)
    -- aca una accion referencial ( cascade, restrict, no action, etc ).
) ENGINE=INNODB;

3votos

dairon Puntos17140

Según Recuerdo el PostgreSQL si soporta la herencia en su extructura por si te sirve de algo aquí te dejo algo de documentación:

CREATE TABLE ciudades (
    nombre        text,
    poblacion     float,
    altura        int
);

CREATE TABLE capitales (
    departamento           char(2)
) INHERITS (ciudades);

Tutoriales de Postgre
Herencias de Tablas en Postgre
Características Avanzadas de SQL en Postgres
Espero te sirva de ayuda. Saludos Dairon

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta