SQL - Necesito ayuda en la estructura de mi base de datos

   
Vista:

Necesito ayuda en la estructura de mi base de datos

Publicado por Rodrigo (6 intervenciones) el 26/05/2015 11:16:40
Hola a todos, estoy realizando una base de datos para un programa de gestión de talleres de motos, por el momento llevo 1500 lineas de código y no quiero continuar sin antes aclarar unas dudas que tengo sobre claves e indices.

Los indices los he de crear en las claves primarias y foráneas y a parte en los campos en los que quiera realizar búsquedas, pero algunas de estas se hacen automáticamente al importarlas al phpmyadmin? Abría que crear mas indices?

Me han aconsejado una forma para crear las claves primarias y foraneas, pero cual es la optima? Ya que de momento al importar el archivo sql a phpmyadmin no me reconoce la clave foranea. Lo tengo asi.

1
2
id_cliente INTEGER NOT NULL PRIMARY KEY,
id_codpostal INTEGER REFERENCES codpostal

la mejor manera no sería así?

1
2
3
4
id_cliente INTEGER NOT NULL,
id_codpostal INTEGER,
PRIMARY KEY (id_cliente),
FOREIGN KEY (id_codpostal) REFERENCES codpostal

Al insertar datos da igual si los varchar los hago con `nombre` o "nombre"?

Si a parte de esto alguna alma caritativa me quiere echar una mano, compartiré con el por dropbox, drive o lo que sea el archivo .sql.

Gracias de antemano y saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Necesito ayuda en la estructura de mi base de datos

Publicado por leonardo_josue (877 intervenciones) el 26/05/2015 18:02:50
Hola Rodrigo:

Vayamos por partes: no nos mencionas qué BD's estás utilizando, pero al hablar de phpmyadmin, puedo suponer que se trata de MySQL.

Ahora, con respecto a lo que comentas:

1
2
3
Los indices los he de crear en las claves primarias y foráneas y a parte en los campos en los que quiera
realizar búsquedas, pero algunas de estas se hacen automáticamente al importarlas al phpmyadmin?
Abría que crear mas indices?

Debes tener cuidado con el uso de índices, ya que si abusas de estos puedes hacer que el performance del servidor se vea afectado, entonces en lugar de hacer más rápidas las búsquedas, puedes hacerlas más lentas. No se trata de crear índices sobre todos los campos por los que vas a realizar una búsqueda, sino más bien analizar si la búsqueda en puede afectar el rendimiento.

Como mejor práctica, se suele aplicar indices sobre campos de búsquedas que utilices con frecuencia, sin embargo, si tienes alguna consulta sobre un campo que ejecutas sólo en pocas ocasiones, entonces no hay necesidad de marcar ese campo como indice.

1
2
Me han aconsejado una forma para crear las claves primarias y foraneas, pero cual es la optima? Ya que
de momento al importar el archivo sql a phpmyadmin no me reconoce la clave foranea.

Ojo, no sé a qué te refieres con importar el archivo SQL, pero lo que comentas puede tener precisamente con lo que te comento del motor de BD's que estés utilizando. En el caso de MySQL, la sintáxis correcta para crear una llave foránea es la siguiente:


1
2
3
4
5
6
7
8
[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]
 
reference_option:
    RESTRICT | CASCADE | SET NULL | NO ACTION

http://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html

es decir, la primer forma NO ES COMPATIBLE CON MySQL, es por eso que no está reconociendo tus sentencias.

1
Al insertar datos da igual si los varchar los hago con `nombre` o "nombre"?

Mucho ojo, en MySQL hay tres caracteres distintos que te pueden confundir: El acento invertido (`), la comilla simple ('), o la doble comilla (").

El acento grave o invertido (`) se utiliza para NOMBRAR OBJETOS, como nombres de tablas o columnas:

1
2
3
mysql> CREATE TABLE `tabla` (
                  `id` INT,
                  descripcion VARCHAR(20));

esto no es necesario, pero es recomendable, observa en el ejemplo que al definir el nombre de la `tabla` lo hago entre este caracter, lo mismo que al nombrar el campo `id`, sin embargo al nombrar el campo descripcion, no lo utilizo. Esto tiene que ver con las reglas para nombrar objetos en mysql, revisa el manual para más información.

La comilla simple (') se utiliza en MySQL para DEFINIR CADENAS, es el que deberías utilizar:


1
2
3
4
5
6
7
8
9
10
mysql> INSERT INTO tabla VALUES (1, 'Uno');
Query OK, 1 row affected (0.14 sec)
 
mysql> SELECT * FROM tabla;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | Uno         |
+------+-------------+
1 row in set (0.02 sec)

Las comillas dobles (") TAMBIÉN PUEDES UTILIZARLO PARA DEFINIR CADENAS:

1
2
3
4
5
6
7
8
9
10
11
mysql> INSERT INTO tabla VALUES (2, "Dos");
Query OK, 1 row affected (0.13 sec)
 
mysql> SELECT * FROM tabla;
+------+-------------+
| id   | descripcion |
+------+-------------+
|    1 | Uno         |
|    2 | Dos         |
+------+-------------+
2 rows in set (0.00 sec)

¿Entonces cuál es la diferencia? en realidad ninguna, pero hay algunas "ventajas" en cuanto a utilizar unas u otras, te recomiendo que leas el manual de usuario:

http://mysql.stu.edu.tw/doc/refman/5.0/es/string-syntax.html

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Necesito ayuda en la estructura de mi base de datos

Publicado por Rodrigo (6 intervenciones) el 26/05/2015 18:49:26
Hola Leo, muchas gracias por tu perfecta aclaración, aunque como en todo siempre hay algunas dudillas finales aver si me las puedes aclarar. El uso del acento grave o invertido (`) no lo he encontrado en el manual, aunque si decido no ponerlo no abra ningún problema, no?

Con lo de las claves foraneas lo tenia casi bien antes de que alguien me lo corrigiera, un ejemplo seria este:

1
2
3
4
5
CONSTRAINT `fk_empleados_idiomas`
    FOREIGN KEY (`id_idioma`)
    REFERENCES `idiomas` (`id_idioma`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE,

Tiene un parecido al que me has enviado pero reo que tendré algun problemilla:

1
2
3
4
5
[CONSTRAINT [symbol]] FOREIGN KEY
    [index_name] (index_col_name, ...)
    REFERENCES tbl_name (index_col_name,...)
    [ON DELETE reference_option]
    [ON UPDATE reference_option]

Lo que entiendo es que hay que crear un índice en este caso de idioma y lo crearía así:

1
INDEX `fk_empleados_idiomas_idx` (`id_idioma` ASC)

Lo que no entiendo ahora es si hay que poner en [index_name] lo que seria el [`fk_empleados_idiomas_idx`] o si puedes, pasame una correción de ese mismo ejemplo que te he pasado.
Gracias de antemano y un gran saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Necesito ayuda en la estructura de mi base de datos

Publicado por leonardo_josue (877 intervenciones) el 26/05/2015 19:34:55
Hola de nuevo Rodrigo:

Toda la información que te comento está en el la documentación oficial de MySQL, sólo es cuestión de buscar un poco o preguntarle a SAN GOOGLE... el generalmente tiene la respuesta:

1
2
El uso del acento grave o invertido (`) no lo he encontrado en el manual, aunque si decido no ponerlo no
abra ningún problema, no?

Para el uso del acento grave o invertido, puedes encontrar ayuda en la siguiente dirección:

http://mysql.stu.edu.tw/doc/refman/5.0/es/legal-names.html

Tal como te comenté en el post anterior, el acento grave se utiliza para NOMBRAR OBJETOS... ya que hay algunas reglas que debes seguir para este propósito. Un caso típico donde sería necesario este caracter es por ejemplo si quisieras crear una tabla que se llama SELECT... como la sentencia que usas para hacer consultas... si lo pones SIN ACENTO GRAVE, ocurre un error:

1
2
3
4
mysql> CREATE TABLE select (id INT, descripcion VARCHAR(20));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near 'selec
t (id INT, descripcion VARCHAR(20))' at line 1

Esto es porque SELECT es una palabra RESERVADA... sin embargo, utilizando el acento grave podrías hacerlo sin problemas:

1
2
mysql> CREATE TABLE `select` (id INT, descripcion VARCHAR(20));
Query OK, 0 rows affected (0.27 sec)

Es decir, TODO LO QUE APARECE ENTRE ACENTOS GRAVES SE TOMA COMO UN IDENTIFICADOR. Dale una revisada a la liga que te puse para información adicional.

Ahora bien, con respecto a la sintaxis de las FK, te comento: todo lo que aparece entre corchetes [ ] quiere decir que es OPCIONAL, de hecho tal como lo tienes debe funcionar:

1
2
3
4
5
CONSTRAINT `fk_empleados_idiomas`
FOREIGN KEY (`id_idioma`)
REFERENCES `idiomas` (`id_idioma`)
ON DELETE RESTRICT
ON UPDATE CASCADE

La parte del CONSTRAINT en realidad también puedes omitirlo, esta simplemente es para definir con qué nombre quieres que se guarde la restricción. en realidad bastaría con que coloques esto:

1
2
3
4
FOREIGN KEY (`id_idioma`)
    REFERENCES `idiomas` (`id_idioma`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE,


Haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Necesito ayuda en la estructura de mi base de datos

Publicado por Rodrigo (6 intervenciones) el 26/05/2015 19:43:04
Lo entiendo todo perfectamente, gracias por tus repuestas tan claras y detalladas. Me costará un poco actualizar la base de datos pero en cuanto la tenga lo pruebo y digo algo por aquí, saludos y muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Necesito ayuda en la estructura de mi base de datos

Publicado por Rodrigo (6 intervenciones) el 31/05/2015 18:29:21
Probado y de momento parece que no lo he llegado a pillar o no me estoy fijando en lo que hago al importar la base de datos me da este error:

#1215 - Cannot add foreign key constraint


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE TABLE `clientes` (
  `id_cliente` INTEGER NOT NULL AUTO_INCREMENT,
  `nif_cif` VARCHAR(9) UNIQUE,
  `id_tipcliente` INTEGER NOT NULL COMMENT "Relación con los tipos de cliente",
  `id_idioma` INTEGER NOT NULL COMMENT "Relación con los idiomas",
  `nomfiscal` VARCHAR(50),
  `nomcomercial` VARCHAR(50),
  `direccion` VARCHAR(80),
  `id_codpostal` INTEGER COMMENT "Relación con los códigos postales",
  `telefono1` VARCHAR(17),
  `telefono2` VARCHAR(17),
  `fax` VARCHAR(17),
  `email` VARCHAR(50),
  `password` VARCHAR(10),
  `activo` BOOLEAN DEFAULT 0,
  PRIMARY KEY (`id_cliente`),
  FOREIGN KEY (`id_tipcliente`) REFERENCES `tipclientes` (`id_tipcliente`) ON DELETE RESTRICT ON UPDATE CASCADE,
  FOREIGN KEY (`id_idioma`) REFERENCES `idiomas` (`id_idioma`) ON DELETE RESTRICT ON UPDATE CASCADE,
  FOREIGN KEY (`id_codpostal`) REFERENCES `codpostales` (`id_codpostal`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=innodb DEFAULT CHARSET=utf8;
 
SET autocommit=1;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Necesito ayuda en la estructura de mi base de datos

Publicado por Rodrigo (6 intervenciones) el 31/05/2015 18:56:05
Solucionado, he modificado el orden de creación de las tablas y perfecto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar