Autor
|
Tema: necesito opinión e ideas sobre mi base de datos (Leído 11,470 veces)
|
N4X
|
a lo que te refieres es a tener una sola tabla tipo: tabla_oracion_sitios id_pais id_ca id_provincia id_comarca id_ciudad nombre y si quiero poner españa: id_pais id_ca id_provincia id_comarca id_ciudad nombre 1 0 0 0 0 españa agrego una comunidad autonoma id_pais id_ca id_provincia id_comarca id_ciudad nombre 1 1 0 0 0 cataluña así? hmmm si es el caso... podria ser una buena idea... y trabajar del mismo modo los top... hmmmmm pensaré en ello.. un ejemplo de top10 podria ser: tabla_oracion_top10 id_pais id_ca id_provincia id_comarca id_ciudad id_peticion posicion 1 1 0 0 0 5 1 con lo cual marcariamos la petición (o circular) 5 en la primera posición de cataluña (siguiendo los 2 ejemplos anteriores) hmm me gusta bastante... lo pensaré bien a lo largo del día, pero quiza sea la mejor solución
la comarca no es otra cosa que dividir en porciones mas pequeñas un territorio ( http://es.wikipedia.org/wiki/Comarca)si ponemos un ejemplo seria: pais: españa comunidad autonoma: cataluña provincia: tarragona comarca: baix camp ciudad: reus ( http://es.wikipedia.org/wiki/Reus)lo que yo digo es que hay un representante para cada ciudad, uno para cada comarca, uno para cada provincia, etc... el de ciudad envia su top10 al de su comarca el cual recive todos los top10 de las ciudades que componen la comarca y así sucesivamente hasta llegar al pais. AGREGO:impresionante como cambia la cosa... (me e pasado a las herramientas de mysql por mayor comodidad xD) ahora si está mas bonita esta parte, a mi parecer ni punto de comparación link: http://img11.imageshack.us/img11/1998/dibujoiyo.jpgmuchas gracias por todo... iré haciendo las demás y si tengo problemas agrego un problemita es a la hora de importar el código SQL del Workbench a MySQL le doy a sincronizar y me dice que hay un error, pero no donde ni cual es... Executing SQL script IN server ERROR: Error 1005: Can't create table 'smf_test.web_oracion' (errno: 150) CREATE TABLE IF NOT EXISTS `smf_test`.`web_oracion` ( `id_peticion` INT(10) UNSIGNED NOT NULL , `peticion` VARCHAR(250) NOT NULL , `usr_rel` MEDIUMINT(2) UNSIGNED NOT NULL DEFAULT 1 , `votos` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `hora` TIMESTAMP NOT NULL , `autor` MEDIUMINT(8) UNSIGNED NOT NULL , `id_pais` INT(10) UNSIGNED NOT NULL , `id_ca` INT(10) UNSIGNED NOT NULL , `id_provincia` INT(10) UNSIGNED NOT NULL , `id_comarca` INT(10) UNSIGNED NOT NULL , `id_ciudad` INT(10) UNSIGNED NOT NULL , `id_cat` INT(10) UNSIGNED NOT NULL , PRIMARY KEY (`id_peticion`) , INDEX `relacion2` (`id_comarca` ASC, `id_ciudad` ASC, `id_provincia` ASC, `id_ca` ASC, `id_pais` ASC) , INDEX `categoria` (`id_cat` ASC) , CONSTRAINT `relacion2` FOREIGN KEY (`id_comarca` , `id_ciudad` , `id_provincia` , `id_ca` , `id_pais` ) REFERENCES `smf_test`.`web_oracion_lugares` (`id_comarca` , `id_ciudad` , `id_provincia` , `id_ca` , `id_pais` ) ON DELETE NO ACTION ON UPDATE CASCADE, CONSTRAINT `categoria` FOREIGN KEY (`id_cat` ) REFERENCES `smf_test`.`web_oracion_cat` (`id_cat` ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci SQL script execution finished: statements: 10 succeeded, 1 failed
el sql de phpmy admin dice: #1005 - Can't create table 'smf_test.web_oracion' (errno: 150) saludos nax
|
|
« Última modificación: 13 Enero 2010, 23:42 pm por N4X »
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Vaya que cambio de modelo de tablas me gusta como se ve. Y me alegra que te movieses para WorkBench de MySQL Cuando he visto el error 1005 (errno) no habia leido el script SQL y ya sabia de antemano que eran tablas InnoDB y habia una o mas Foreign Keys dentro es que es tan comun este error con las referencias foreign key en InnoDB...(Aun no se porque) pero ocurre por variadas razones algunas hasta sin sentido. ya pegaste la estructura logica de la tabla web_oracion que viene siendo el hijo, necesito la estructura logica de las tablas padres web_oracion_lugares y web_oracion_cat ya que las razones del fallo anterior son bastantes variadas (No hay 1 sola definicion para que se de el fallo 1005) aveces ocurre porque una tabla hijo no puede hacer un FK a otro FK de otra tabla hijo, aveces me ha pasado porque 1 campo FK INTEGER debia declararlo como UNSIGNED, entre otras situaciones.... Pero necesito la estructura logica de las otras 2 tablas, no solo de la que pegaste aca, para depurar y ver como se podria resolver. Un Saludo.
|
|
|
En línea
|
|
|
|
N4X
|
ok ahora te lo doy... me e dado cuenta que el error no es solo uno.. por haí decian que habia que cambiar los nombres de las FK porque ya existian.. (nothing) que las FK sean exactamente igual a la original (creo que ya lo son... pero nada) este es el sql que genera al sincronizar con la bd. el mydb no e encontrado aun donde borrarlo y que no vuelva SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; USE `mydb`; CREATE TABLE IF NOT EXISTS `smf_test`.`web_oracion_cat` ( `id_cat` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT , `categoria` VARCHAR(100) NOT NULL DEFAULT 0 , PRIMARY KEY (`id_cat`) ) ENGINE = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `smf_test`.`web_oracion_lugares` ( `id_pais` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ca` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_provincia` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_comarca` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ciudad` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `nombre` VARCHAR(100) NOT NULL DEFAULT 0 , `responsable` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0 , PRIMARY KEY (`id_pais`, `id_ca`, `id_provincia`, `id_comarca`, `id_ciudad`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `smf_test`.`web_oracion_top10` ( `id_top` INT(10) UNSIGNED NOT NULL , `id_pais1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ca1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_provincia1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_comarca1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ciudad1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_peticion1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `posicion` INT(10) UNSIGNED NOT NULL DEFAULT 0 , PRIMARY KEY (`id_top`) , INDEX `relacion1` (`id_pais1` ASC, `id_ca1` ASC, `id_provincia1` ASC, `id_comarca1` ASC, `id_ciudad1` ASC) , INDEX `peticion` (`id_peticion1` ASC) , CONSTRAINT `relacion1` FOREIGN KEY (`id_pais1` , `id_ca1` , `id_provincia1` , `id_comarca1` , `id_ciudad1` ) REFERENCES `smf_test`.`web_oracion_lugares` (`id_pais` , `id_ca` , `id_provincia` , `id_comarca` , `id_ciudad` ) ON DELETE NO ACTION ON UPDATE CASCADE, CONSTRAINT `peticion` FOREIGN KEY (`id_peticion1` ) REFERENCES `smf_test`.`web_oracion` (`id_peticion` ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `smf_test`.`web_oracion` ( `id_peticion` INT(10) UNSIGNED NOT NULL , `peticion` VARCHAR(250) NOT NULL DEFAULT 0 , `usr_rel` MEDIUMINT(2) UNSIGNED NOT NULL DEFAULT 1 , `votos` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `hora` TIMESTAMP NOT NULL , `autor` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0 , `id_pais2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ca2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_provincia2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_comarca2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ciudad2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_cat2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , PRIMARY KEY (`id_peticion`) , INDEX `relacion2` (`id_comarca2` ASC, `id_ciudad2` ASC, `id_provincia2` ASC, `id_ca2` ASC, `id_pais2` ASC) , INDEX `categoria` (`id_cat2` ASC) , CONSTRAINT `relacion2` FOREIGN KEY (`id_comarca2` , `id_ciudad2` , `id_provincia2` , `id_ca2` , `id_pais2` ) REFERENCES `smf_test`.`web_oracion_lugares` (`id_comarca` , `id_ciudad` , `id_provincia` , `id_ca` , `id_pais` ) ON DELETE NO ACTION ON UPDATE CASCADE, CONSTRAINT `categoria` FOREIGN KEY (`id_cat2` ) REFERENCES `smf_test`.`web_oracion_cat` (`id_cat` ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
al principio pensaba que era la tabla top10, pues esa se generaba bien y la principal (web_oracion), pero e borrado toda la bd y en sincronizado sin el top10 y da el mismo error. muchas gracias por el soporte a estas alturas andaria desesperado XD
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
Me gustaria decirte cual era el problema..... pero creo que si vez el Codigo modificado te daras cuenta... Codigo: SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL'; CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ; USE `mydb`; CREATE TABLE IF NOT EXISTS `smf_test`.`web_oracion_cat` ( `id_cat` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT , `categoria` VARCHAR(100) NOT NULL DEFAULT 0 , PRIMARY KEY (`id_cat`) ) ENGINE = InnoDB AUTO_INCREMENT = 3 DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `smf_test`.`web_oracion_lugares` ( `id_pais` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ca` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_provincia` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_comarca` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ciudad` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `nombre` VARCHAR(100) NOT NULL DEFAULT 0 , `responsable` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0 , PRIMARY KEY (`id_pais`, `id_ca`, `id_provincia`, `id_comarca`, `id_ciudad`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `smf_test`.`web_oracion` ( `id_peticion` INT(10) UNSIGNED NOT NULL , `peticion` VARCHAR(250) NOT NULL DEFAULT 0 , `usr_rel` MEDIUMINT(2) UNSIGNED NOT NULL DEFAULT 1 , `votos` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `hora` TIMESTAMP NOT NULL , `autor` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT 0 , `id_pais2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ca2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_provincia2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_comarca2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ciudad2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_cat2` INT(10) UNSIGNED NOT NULL DEFAULT 0 , PRIMARY KEY (`id_peticion`) , INDEX `relacion2` (`id_pais2` ASC, `id_ca2` ASC, `id_provincia2` ASC, `id_comarca2` ASC, `id_ciudad2` ASC) , INDEX `categoria` (`id_cat2` ASC) , /*CONSTRAINT `relacion2`*/ FOREIGN KEY (`id_pais2`, `id_ca2` , `id_provincia2` , `id_comarca2`, `id_ciudad2` ) REFERENCES `smf_test`.`web_oracion_lugares` (`id_pais`, `id_ca` , `id_provincia` , `id_comarca` , `id_ciudad` ) ON DELETE NO ACTION ON UPDATE CASCADE, CONSTRAINT `categoria` FOREIGN KEY (`id_cat2` ) REFERENCES `smf_test`.`web_oracion_cat` (`id_cat` ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; CREATE TABLE IF NOT EXISTS `smf_test`.`web_oracion_top10` ( `id_top` INT(10) UNSIGNED NOT NULL , `id_pais1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ca1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_provincia1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_comarca1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_ciudad1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `id_peticion1` INT(10) UNSIGNED NOT NULL DEFAULT 0 , `posicion` INT(10) UNSIGNED NOT NULL DEFAULT 0 , PRIMARY KEY (`id_top`) , INDEX `relacion1` (`id_pais1` ASC, `id_ca1` ASC, `id_provincia1` ASC, `id_comarca1` ASC, `id_ciudad1` ASC) , INDEX `peticion` (`id_peticion1` ASC) , CONSTRAINT `relacion1` FOREIGN KEY (`id_pais1` , `id_ca1` , `id_provincia1` , `id_comarca1` , `id_ciudad1` ) REFERENCES `smf_test`.`web_oracion_lugares` (`id_pais` , `id_ca` , `id_provincia` , `id_comarca` , `id_ciudad` ) ON DELETE NO ACTION ON UPDATE CASCADE, CONSTRAINT `peticion` FOREIGN KEY (`id_peticion1` ) REFERENCES `smf_test`.`web_oracion` (`id_peticion` ) ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci; SET SQL_MODE=@OLD_SQL_MODE; SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
Te dare una orejita Fijate en: Tabla web_oracion_lugares PRIMARY KEY (`id_pais`, `id_ca`, `id_provincia`, `id_comarca`, `id_ciudad`) )
Tabla web_oracion INDEX `relacion2` (`id_pais2` ASC, `id_ca2` ASC, `id_provincia2` ASC, `id_comarca2` ASC, `id_ciudad2` ASC) , INDEX `categoria` (`id_cat2` ASC) , /*CONSTRAINT `relacion2`*/ FOREIGN KEY (`id_pais2`, `id_ca2` , `id_provincia2` , `id_comarca2`, `id_ciudad2` ) REFERENCES `smf_test`.`web_oracion_lugares` (`id_pais`, `id_ca` , `id_provincia` , `id_comarca` , `id_ciudad` )
Observate el orden de campos PRIMARY KEY de web_oracion_lugares y el orden modificado actual de los INDICES y FK de web_oracion Un error tonto lo se....... pero ya vez como trabaja InnoDB en MySQL aveces. Prueba el code ahora
|
|
|
En línea
|
|
|
|
N4X
|
ja... si que es para darse un par de palmaditas......... muchas gracias xD no sabia yo que hacia esa distincción de orden... enfin... pues bueno... ya como no podia ser distinto... dejo otro "problema" (al final me vas a cobrar xD) ejecuto el sql.. todo correcto me voy al phpmyadmin y en la parte de diseñador, no se ve las relaciones hacia web_oracion_lugares... bueno como normalmente la parte Diseñador siempre me ha funcionado como ha querido... me voy a las tablas y busco las FK... estan alli (en ambas tablas) entonces... creo unos cuantos datos... me relaciona todo bien, es decir cuando voy a guardar datos en web_oracion, en id_cat2 (que va relacionado con las categorias) me muestra una lista de todas ellas... sin problemas pero en la parte de id_pais2, etc... no me muestra ninguna lista y al guardar los datos no me muestra un "link" como suele hacer.... hay alguna forma de comprobar que realmente están funcionando correctamente? saludos! nax
|
|
|
En línea
|
|
|
|
^Tifa^
Desconectado
Mensajes: 2.804
|
ja... si que es para darse un par de palmaditas......... muchas gracias xD no sabia yo que hacia esa distincción de orden... Tranquilo, yo tampoco lo sabia lol me di cuenta depurando el Codigo en MySQL. Pero yo tampoco sabia que InnoDB exhigia este orden de PK con FK. hay alguna forma de comprobar que realmente están funcionando correctamente?
Si ya de antemano se actualizan las tablas padre-hijo es porque esta funcionando. Si las relaciones existen realmente (Y podras darte cuenta con SHOW CREATE TABLE tabla) y vez algun punto donde diga REFERENCES es porque efectivamente la relacion existe. Ahora, todo se va a regir acorde a las condiciones que tu diste en este caso: ON DELETE NO ACTION ON UPDATE CASCADE Por lo que estaras consciente que si eliminas aca en el padre no se aplicara en el hijo, pero si actualizas en el padre por ley debe actualizarse en el hijo, sino pasa asi es porque las tablas no estan en motor InnoDB o porque el nivel de aislamiento no es el que trae por defecto MySQL (Este ultimo lo dudo que lo hayas modificado) Actualiza un dato padre y verifica si se aplica al hijo
|
|
|
En línea
|
|
|
|
N4X
|
Si ya de antemano se actualizan las tablas padre-hijo es porque esta funcionando.
que gran verdad!! que espeso estoy hoy ok todo correcto hasta día de hoy, cualquier cosa edito
|
|
|
En línea
|
|
|
|
|
|