necesito opinión e ideas sobre mi base de datos

Iniciado por N4X, 6 Enero 2010, 02:41 AM

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

N4X

#10
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.jpg

muchas 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...

Código (sql) [Seleccionar]

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


^Tifa^

Vaya que cambio de modelo de tablas  ;-)  me gusta como se ve. Y me alegra que te movieses para WorkBench de MySQL  ;D

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  :xD 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.

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  :laugh:

Código (sql) [Seleccionar]
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

^Tifa^

Me gustaria decirte cual era el problema..... pero creo que si vez el Codigo modificado te daras cuenta...


Codigo:

Código (sql) [Seleccionar]


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  :P

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  ;)

N4X

ja... si que es para darse un par de palmaditas.........  :-X

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

^Tifa^

Citarja... si que es para darse un par de palmaditas.........  :-X

muchas gracias xD no sabia yo que hacia esa distincción de orden...

Tranquilo, yo tampoco lo sabia lol  :xD  me di cuenta depurando el Codigo en MySQL. Pero yo tampoco sabia que InnoDB exhigia este orden de PK con FK.

Citarhay 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  ;)

N4X

Cita de: ^TiFa^ en 14 Enero 2010, 19:41 PM
Si ya de antemano se actualizan las tablas padre-hijo es porque esta funcionando.

que gran verdad!! que espeso estoy hoy  :P

ok todo correcto hasta día de hoy, cualquier cosa edito  :silbar: