Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: #Aitor en 6 Marzo 2018, 01:54 am



Título: Base de datos con eficiencia?
Publicado por: #Aitor en 6 Marzo 2018, 01:54 am
Quisiera crear una base de datos relativamente simple, sin embargo creo que la manera en la que estoy enfocando la base de datos no es la mejor manera en cuánto a eficiencia.

Solo necesito el nombre de las personas, y un valor booleano, tal que así.

(https://image.ibb.co/gtqEOS/Bases_de_datos.png)

El problema está como se puede apreciar que necesito controlarlo para todas las fechas posibles. Mi idea sería crear un programa que preguntase si en la tabla existe X fecha, y sino existe crearla, sin embargo no lo veo eficiente, porque al cabo de un año tendré una tabla entera con 366 columnas. Sinceramente no tengo mucha idea de bases de datos, ¿hay alguna forma de evitarse este problema?


Título: Re: Base de datos con eficiencia?
Publicado por: EFEX en 6 Marzo 2018, 02:53 am
No, no es buena practica agregar nuevas columnas, modificar la db puede corromperla si no sabes lo que haces, ademas el formato de tiempo(YYYY/MM/DD) no es bueno para definir una columna. Lo mejor seria crear otra tabla y relacionar los datos.

Código
  1. id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  2. firstname VARCHAR(30) NOT NULL,
  3. email VARCHAR(50)
  4. );
  5.  
  6. CREATE TABLE attend (
  7. id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  8. user_id INT(6) UNSIGNED,                                        /* Lo relacionamos con el id del usuario */
  9. DATE DATE
  10. );

Y luego en nuestra consulta pedimos los datos ordenados como lo queramos..
Código
  1. /* Obtener todas fechas y usuarios */
  2. SELECT USER.id, firstname, DATE
  3. FROM attend
  4. INNER JOIN USER ON attend.user_id = USER.id;


http://sqlfiddle.com/#!9/7307a7/1


Título: Re: Base de datos con eficiencia?
Publicado por: #Aitor en 6 Marzo 2018, 23:22 pm
No, no es buena practica agregar nuevas columnas, modificar la db puede corromperla si no sabes lo que haces, ademas el formato de tiempo(YYYY/MM/DD) no es bueno para definir una columna. Lo mejor seria crear otra tabla y relacionar los datos.

Código
  1. id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  2. firstname VARCHAR(30) NOT NULL,
  3. email VARCHAR(50)
  4. );
  5.  
  6. CREATE TABLE attend (
  7. id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
  8. user_id INT(6) UNSIGNED,                                        /* Lo relacionamos con el id del usuario */
  9. DATE DATE
  10. );

Y luego en nuestra consulta pedimos los datos ordenados como lo queramos..
Código
  1. /* Obtener todas fechas y usuarios */
  2. SELECT USER.id, firstname, DATE
  3. FROM attend
  4. INNER JOIN USER ON attend.user_id = USER.id;


http://sqlfiddle.com/#!9/7307a7/1



Vale, tiene sentido, no sabía de la existencia de las relaciones...  ;-)

¡Muchas gracias!  :-*