Autor Tema: Algo sobre diseño de base de datos  (Leído 3689 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Algo sobre diseño de base de datos
« : agosto 17, 2011, 07:08:13 am »
Verán tengo una duda en este diseño de base de datos y ahora mismo tengo que realizar un pequeños proyecto para registrar los datos de los habitantes de un conjunto residencial.
Nada del código es problema es solo una duda.
Les cuento:

Se deben registrar las casas y seleccionar el estado de la casa (Propia o Arrendada)

Propia-> Se selecciona un propietario de una lista (previamente registrado) se guarda el registro, después tengo que registrar el resto de habitantes de esta casa.

Arrendada-> Se selecciona un propietario de una lista (previamente registrado) y adicional se registra un Arrendatario, y los datos para el resto de habitantes para la casa.
Esto es básicamente lo que toca hacer.

Mi duda es como relaciono propietarios con la casa y en caso de ser de ser arrendada como relaciono al arrendatario con la casa.

No quiero que me den el SQL solo algunas orientaciones y sugerencias, gracias.

Desconectado Radiux

  • Sv Full Member
  • *
  • Mensajes: 939
Re: Algo sobre diseño de base de datos
« Respuesta #1 : agosto 17, 2011, 08:33:42 am »
¿Pero y ya realizaste el modelo conceptual, o aunque sea un modelo EER?

De manera esquematica, se te clarificarian bastante las cosas, y si utilizas power designer para crear tus esquemas, la herramienta te genera automaticamente el script para crear la BD.

Asi de primera mano, y sin conocer los detalles especificos de toda la base, te podria decir que CASA es una superclase con dos subclases: casa_propia y casa_arrendada.
casa_propia va a tener una relacion n-1 con Propietario (porque un propietario puede tener muchas casas) casa_arrendada va a tener una relacion n-1 con Propietario (por la misma razon anterior) y ademas va a tener una relacion 1-1 con Arrendatario.

Por el lado de PERSONA, va a tener como subclases a Propietario, Arrendatario y Habitante

Al final en el esquema fisico (y por consiguiente las tablas de la base) casa_propia va a tener como FK el PK del propietario y casa_arrendada va a tener  el PK del propietario y el PK del arrendatario como foreign keys.

Habitante va a tener como FK el ID de la CASA en la que habita.

En la superclase CASA: almacenarias toda la informacion pertinente a la casa, y en la superclase PERSONA: almacenarias toda la informacion pertinente a las personas.
« Última Modificación: agosto 17, 2011, 08:36:45 am por Radiux »

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Re: Algo sobre diseño de base de datos
« Respuesta #2 : agosto 17, 2011, 09:23:52 am »
He armado un rapido model E-R teniendo en cuenta lo que me dices, ahora tengo una ligera duda.
Habitante va a tener como FK el ID de la CASA en la que habita.

El FK de la casa no importa si es arrendada o propia?

Desconectado Radiux

  • Sv Full Member
  • *
  • Mensajes: 939
Re: Algo sobre diseño de base de datos
« Respuesta #3 : agosto 17, 2011, 09:36:44 am »
He armado un rapido model E-R teniendo en cuenta lo que me dices, ahora tengo una ligera duda.
El FK de la casa no importa si es arrendada o propia?

No realmente, porque solamente te interesa saber donde vive, no el estado de la casa, claro, que si quisieras saber el estado de la casa en la que vive un habitante especifico, es facil relacionar las tablas entre si.

Por ejemplo si Luis Mendez vive en la casa con ID 231, vas a buscar a las tablas casa_propia y casa_arrendada ese ID en especifico, y si la consulta te devuelve un valor en una u otra tabla, entonces sabrias si la casa es arrendada o los propietarios viven en ella. O incluso seria mas facil si usas un atributo "estado" en CASA para saber el estado de la casa.

Otra cosa que se me olvido mencionar, Recuerda que casa_propia y casa_arrendada heredan el ID de Casa, asi que el ID seria el mismo, asi que no tendrias problemas en relacionar tablas por medio de consultas con joins.

Ya cuando tengas tu primer borrador de la base de datos, vas a tener que tomar en cuenta casos especiales, como por ejemplo, cuando una casa tenga mas de un propietario.
« Última Modificación: agosto 17, 2011, 09:45:08 am por Radiux »

Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Re: Algo sobre diseño de base de datos
« Respuesta #4 : agosto 17, 2011, 09:48:30 am »
Ya cuando tengas tu primer borrador de la base de datos, vas a tener que tomar en cuenta casos especiales, como por ejemplo, cuando una casa tenga mas de un propietario

Esto ya seria para como un historial verdad?

Desconectado Radiux

  • Sv Full Member
  • *
  • Mensajes: 939
Re: Algo sobre diseño de base de datos
« Respuesta #5 : agosto 17, 2011, 09:50:55 am »
Esto ya seria para como un historial verdad?

Nop, me refiero a que una casa puede tener mas de un propietario al mismo tiempo. Cuando dos personas aparecen como copropietarias en la escritura de la casa.

Desconectado mxgxw

  • Global Moderator
  • The Communiter-
  • *
  • Mensajes: 5665
  • Starlet - 999cc
    • mxgxw
Re: Algo sobre diseño de base de datos
« Respuesta #6 : agosto 17, 2011, 09:54:24 am »
¿Pero y ya realizaste el modelo conceptual, o aunque sea un modelo EER?

De manera esquematica, se te clarificarian bastante las cosas, y si utilizas power designer para crear tus esquemas, la herramienta te genera automaticamente el script para crear la BD.

Asi de primera mano, y sin conocer los detalles especificos de toda la base, te podria decir que CASA es una superclase con dos subclases: casa_propia y casa_arrendada.
casa_propia va a tener una relacion n-1 con Propietario (porque un propietario puede tener muchas casas) casa_arrendada va a tener una relacion n-1 con Propietario (por la misma razon anterior) y ademas va a tener una relacion 1-1 con Arrendatario.

Por el lado de PERSONA, va a tener como subclases a Propietario, Arrendatario y Habitante

Al final en el esquema fisico (y por consiguiente las tablas de la base) casa_propia va a tener como FK el PK del propietario y casa_arrendada va a tener  el PK del propietario y el PK del arrendatario como foreign keys.

Habitante va a tener como FK el ID de la CASA en la que habita.

En la superclase CASA: almacenarias toda la informacion pertinente a la casa, y en la superclase PERSONA: almacenarias toda la informacion pertinente a las personas.


Yo diferiría un poco de ese diseño.

Primero: Una casa es una casa. Realmente te interesa la relación de propiedad de la casa de la persona. Yo lo haría de esta manera:

CASA // Esto contiene toda la información física de la casa, aquí no importa si es propia o arrendada ya que nuestro objeto casa representa nuestra entidad física.

PERSONA // Esta tabla simplemente lleva el registro de todas las personas, sin relacionarlas directamente a la casa:

Luego vienen las relaciones que es lo importante. Primero tendrías una tabla que sería "relacion_de_pertenencia":

PERTENENCIA // Esta tabla denota una relación, estaría hecha por una llave primaria compuesta (idcasa,idpersona,idpertenencia), idpertenencia es un catálogo que define el tipo de pertenencia (1 propia, 2 alquilada). Adicionalmente podrías agregar una tributo booleando que te permita saber si esa persona habita en esa casa.

Esta tabla te permite hacer algo interesante: Vos podes tener al propietario de la casa y al arrendatario en la misma tabla:

1,12,1,0 // propietario que no habita la vivienda
1,13,2,1 // arrendatario que habita la vivienda

Incluso podrías tener un tercer código para los habitantes:

1,16,3,1 // habitante X
 
Si quisieras por ejemplo, obtener todos los propietarios de la vivienda 1 (en caso fueran varios):

Código: [Seleccionar]
SELECT
  PERSONA.*
FROM PERTENENCIA INNER JOIN PERSONA ON PERTENENCIA.IDPERSONA=PERSONA.IDPERSONA
  WHERE IDPERTENENCIA=1 AND
  IDCASA=1

Si quisieras obtener todas las personas que estan arrendando una vivienda

Código: [Seleccionar]
SELECT
  CASA.*,
  PERSONA.*
FROM PERTENENCIA INNER JOIN PERSONA ON PERTENENCIA.IDPERSONA=PERSONA.IDPERSONA  INNER JOIN CASAON PERTENENCIA.IDCASA=CASA.IDCASA
  WHERE IDPERTENENCIA=2

Si quisieras obtener todas las personas que habitan en una casa específica:

Código: [Seleccionar]
SELECT
  PERSONA.*
FROM PERTENENCIA INNER JOIN PERSONA ON PERTENENCIA.IDPERSONA=PERSONA.IDPERSONA
  WHERE PERSONA.HABITA=1 AND PERTENENCIA.IDCASA=1

Todo con tres tablas ;) Si quisieras normalizar podrías hacer catalogo para el tipo de pertenencia.


Adendo: Este modelo te permite almacenar cosas interesantes, por ejemplo si una persona arrenda varias casas no necesita habitar en la misma (tal vez las arrenda para negocio o para la otra mujer en una segunda casa o simplemente vive en el extranjero y viven los hijos en la casa). Incluso podrías almacenar casas "ocupadas" en las que ni el propietario ni el arrendador habitan la casa y solo hay "otras personas" ;)
« Última Modificación: agosto 17, 2011, 10:03:35 am por mxgxw »


Desconectado pippin

  • Sv Member
  • ***
  • Mensajes: 301
Re: Algo sobre diseño de base de datos
« Respuesta #7 : agosto 17, 2011, 10:00:49 am »
Nop, me refiero a que una casa puede tener mas de un propietario al mismo tiempo. Cuando dos personas aparecen como copropietarias en la escritura de la casa.

Ah entiendo