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:
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).
- Usuarios
- Continentes
- Paises
- Comunidades autónomas
- Ciudades autónomas
- Provincias
- Localidades
- Orientaciones sexuales
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;