Ver Mensaje Individual
  #1 (permalink)  
Antiguo 17/09/2007, 09:35
yoguuu
 
Fecha de Ingreso: enero-2005
Mensajes: 149
Antigüedad: 19 años, 4 meses
Puntos: 2
Ayuda normalización tablas para ganar consistencia

Hola amig@s, les explico:

Tengo cierta ilusión en desarrollar una página de contactos. Pero a medida que voy trabajando en esto me van surgiendo dudas, sobretodo en el diseño de la base de datos.

La base de datos usa un engine InnoDB, con relaciones creadas en la misma instrucción de crear la tabla, con charset 'UTF8' y collation 'utf8_general_ci'.

1. Las entidades de esta base de datos son las siguientes:
  1. Usuarios
  2. Continentes
  3. Paises
  4. Comunidades autónomas
  5. Ciudades autónomas
  6. Provincias
  7. Localidades
  8. Orientaciones sexuales
De una forma muy clara podeis ver que es simple, son 'usuarios', 'zonas geograficas' y 'orientaciones sexuales'. Considero que en principio para una pagina de contactos simple (WEB 2.0 = Beta xD :P).

La cosa es que estas zonas geograficas... Continentes, paises, com... estas zonas, a medida que somos mas específico en diferentes partes del mundo reciben nombres diferentes (Comunidades autonomas / Estados), ( Provincias / Villas ) y así más...

Entonces, me pregunto si esta forma de hacer que he previsto en un futuro sería consistente... Por ejemplo si quiero comenzar haciendo solo una pagina de españa... y despues amplio a mas paises, y al hacerlo me encuentro que tal como lo estaba haciendo... para los demás paises no es posible así. Como puedo entonces abstraer este tipo de datos para no tener este tipo de problemas ? Quitando nombres y especificando niveles ? regiones de mayor nivel y menor nivel ? :S Cual es vuestra opinión de como deberia hacer...

Luego tengo solo 1 duda más: Un usuario tiene en la tabla asignada una zona geografica a través de las claves foraneas, pero puede darse el caso que un usuario, pueda pertenecer a una comunidad autonoma y no a una ciudad autonoma... saben ustedes si podria dar valores 'NULL' A uno de los dos valores sin que este valor 'NULL' afecte a la integridad referencial que las relaciones obligan ???

Que les parece de paso la normalización en este ejemplo ? alguna sugerencia ? GRACIAS DE ANTEMANO !!! y por su paciencia al leer este tocho...

Código:
@ = Entidad
PK = Clave primaria
FK = Clave foranea
& = Atributo
- = Datos

@ Usuarios
	PK Id
	FK Id continente
	FK Id país  
	FK Id comunidad autónoma
	FK Id ciudad autonoma /* No en el sql todavía, pero la sentencia se ejecuta correctamente y se crea la tabla */
	FK Id provincia
	FK Id localidad
	FK Id orientación sexual
	& Usuario
	& Contraseña
	& E-mail
	& Fecha de nacimiento
	& Estado del usuario
	& fecha cumplimiento estado
	
@ Continentes	
	PK Id
	& Continente
		- Africa			
		- América			
		- Asia			
		- Europa			
		- Oceanía

@ Paises
	PK Id
	& País

@ Comunidades autónomas
	PK Id
	& Comunidad autónoma

@ Provincias
	PK Id
	& Provincia

@ Localidades
	PK Id
	& Localidad

@ Orientaciones sexuales
	PK Id
	& Orientación sexual	
		- Heterosexual
		- Homosexual
		- Bisexual
		- Asexual
		- Pansexual


/* SQL DE LA BASE DE DATOS */

CREATE TABLE `Continentes` (
`id` INT( 1 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Continente` VARCHAR( 7 ) NOT NULL
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `Paises` (
`id` INT( 3 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`País` VARCHAR( 50 ) NOT NULL ,
`Id continente` INT( 1 ) UNSIGNED NOT NULL ,
INDEX ( `Id continente` ) ,
FOREIGN KEY ( `Id continente` ) REFERENCES `Continentes` ( `id` ) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `Comunidades autónomas` (
`id` INT( 2 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Comunidad autónoma` VARCHAR( 50 ) NOT NULL ,
`Id país` INT( 3 ) UNSIGNED NOT NULL ,
INDEX ( `Id país` ) ,
FOREIGN KEY ( `Id país` ) REFERENCES `Paises` ( `id` ) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `Provincias` (
`id` INT( 2 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Provincia` VARCHAR( 50 ) NOT NULL ,
`Id comunidad autónoma` INT( 2 ) UNSIGNED NOT NULL ,
INDEX ( `Id comunidad autónoma` ) ,
FOREIGN KEY ( `Id comunidad autónoma` ) REFERENCES `Comunidades autónomas` ( `id` ) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `Localidades` (
`id` INT( 5 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`localidad` VARCHAR( 50 ) NOT NULL ,
`Id provincia` Int( 2 ) UNSIGNED NOT NULL ,
INDEX ( `Id provincia` ) ,
FOREIGN KEY ( `Id provincia` ) REFERENCES `Provincias` ( `id` ) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `Orientaciones sexuales` (
`id` INT( 1 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`Orientación sexual` VARCHAR( 50 ) NOT NULL
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;

CREATE TABLE `Usuarios` (
`id` INT( 9 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`usuario` VARCHAR( 30 ) NOT NULL ,
`contraseña` VARCHAR( 30 ) NOT NULL ,
`email` VARCHAR( 100 ) NOT NULL ,
`fecha de nacimiento` DATETIME NOT NULL ,
`estado del usuario` VARCHAR( 20 ) NOT NULL ,
`fecha cumplimiento estado` DATETIME NOT NULL ,
`Id continente` INT( 1 ) UNSIGNED NOT NULL ,
`Id país` INT( 3 ) UNSIGNED NOT NULL ,
`Id comunidad autónoma` INT( 2 ) UNSIGNED NOT NULL ,
`Id provincia` INT( 2 ) UNSIGNED NOT NULL ,
`Id localidad` INT( 5 ) UNSIGNED NOT NULL ,
`Id orientación sexual` INT( 1 ) UNSIGNED NOT NULL ,
INDEX ( `Id continente` ) ,
INDEX ( `Id país` ) ,
INDEX ( `Id comunidad autónoma` ) ,
INDEX ( `Id provincia` ) ,
INDEX ( `Id localidad` ) ,
INDEX ( `Id orientación sexual` ) ,
FOREIGN KEY ( `Id continente` ) REFERENCES `Continentes` ( `id` ) ON UPDATE CASCADE ON DELETE CASCADE ,
FOREIGN KEY ( `Id país` ) REFERENCES `Paises` ( `id` ) ON UPDATE CASCADE ON DELETE CASCADE ,
FOREIGN KEY ( `Id comunidad autónoma` ) REFERENCES `Comunidades autónomas` ( `id` ) ON UPDATE CASCADE ON DELETE CASCADE ,
FOREIGN KEY ( `Id provincia` ) REFERENCES `Provincias` ( `id` ) ON UPDATE CASCADE ON DELETE CASCADE ,
FOREIGN KEY ( `Id localidad` ) REFERENCES `Localidades` ( `id` ) ON UPDATE CASCADE ON DELETE CASCADE 
) ENGINE = innodb CHARACTER SET utf8 COLLATE utf8_general_ci;