[DUDA] Estructura de datos relacionados

  • Autor Autor WWWW
  • Fecha de inicio Fecha de inicio
WWWW

WWWW

VIP
Pi
Verificación en dos pasos activada
Suscripción a IA
Hola. Tengo una duda respecto una relación de datos entre tablas.


Cual sera la mejor más rápida, flexible y standar por decirlo así de hacer esta relación Y sobre todo que consuma menos recursos.

Por ejemplo tengo una tabla con cursos y los siguientes niveles para cada curso (basico, intemedio, avanzado, profesinal).


Tabla-Curso
PHP:
id_curso | nombre_curso
1 | Mate
2 | Física
3 | Contabilidad
4 | Compu
5 | .... hasta los necesarios


La siguiente forma la realizo cuando no hay muchas variantes, como es en este caso con los niveles, que son solo 4.

FORMA 1

Hacemos la validación del lado del programa, para que cada curso quede en la columna según su nivel y separados por coma "," como un array, para cada nivel

Tabla Usuarios
PHP:
id_user | nombre_user | nivel_basico | nivel_intermedio | nivel_avanzado | nivel_profesional
   54   | Pepe_Pepez  |       1,3    |          2       |        7,9     |      5,11


Bueno la siguiente forma es donde me surge la duda, ya que he leído que es mejor esta forma, ya que seria fácil de interpretar por SQL y implantar la DB en otro tipo de aplicaciones.

FORMA 2

En esta forma, se crearía una nueva tabla donde se van agregando los cursos, según su nivel y usuario.

Tabla Usuarios
PHP:
id_user | nombre_user
   54   | Pepe_Pepez

Tabla Cursos Asignados
PHP:
id_asignado | nivel_basico | nivel_intermedio | nivel_avanzado | nivel_profesional | id_user
  45          | 1        | null/0       | null/0       | null/0       | 54
  46          | 3        | null/0       | null/0       | null/0       | 54
  58          | null/0   | 2            | null/0       | null/0       | 54
  94          | null/0   | null/0       | 7            | null/0       | 54
  99          | null/0   | null/0       | 9            | null/0       | 54
 110          | null/0   | null/0       | null/0       | 5            | 54



Preguntas / Dudas
1. Cual es la forma correcta?

2. Cual seria la mejor forma de las 2 anteriores?

3. Tienes alguna mejor forma para guardar estos datos?



Gracias por su ayuda, saludos.
 
[MENTION=41434]WWWW[/MENTION] Hola. Segun mi manera de ver la segunda forma es la correcta. Explicaré mis razones, que puedes tomar o simplemente dejarlas pasar por alto 😀:

* En la primera forma tienes elementos que no forman parte o no dependen funcionalmente de la llave primaria, de manera tal que debes sacarlos en una nueva tabla así como lo tienes en la forma 2.
* Un usuario puede tener muchos cursos asignados y un curso puede tener a la vez a muchos usuarios. A mi manera de ver es una relación de muchos a muchos en donde deberías:
- Dejar la tabla usuario tal como esta, puede agregar los atributos que desee siempre y cuando dependan de la llave primaria .
- Crear una tabla de solo cursos, con su respectivo id y nombre del curso.
- (Relación muchos a muchos) Crear una tabla intermedia con una relación entre usuario y curso y dentro de esa relación (tabla) le
agregas los demás atributos correspondientes que en este caso son los niveles.

Trata de utilizar campos atómicos, es decir, no coloques el nombre como Pepe_Pepez en un solo campo y divídelo en primer_nombre, segundo_nombre, primer_apellido, segundo_apellido, etc...

Debes hacer un buen diseño, siempre trato de que esté normalizado al máximo posible, pero si no te importa la normalización simplemente déjalo como está en la forma 2.

Saludos​
 
[MENTION=49061]ismadobe[/MENTION]

Gracias por responder amigo.

Bueno como has dicho la primera forma no llevara llave foranea y menos depende de una llave primaria.

Forma1: La idea era obtener todos los id de los cursos y después validar del lado del programa, cuales estaban en la columna de básico, intermedio, avanzado, profesional respectivamente.

Forma2: Mientras en esta forma miro muchos null/0 como quiera que quede el valor del campo al final, por lo que se me hacen incensarios.

Ahora me has iluminado con otra forma, que puede ser mejor que la FORMA 2



Digamos:

FORMA3

Usando la tabla de usuarios y cursos escritas antes.

Tabla cursos
PHP:
id_curso | nombre_curso
1        | Mate
2        | Física
3        | Contabilidad
4        | Compu
5        | .... hasta los necesarios

Tabla usuarios
PHP:
id_user | nombre_user
   54   | Pepe_Pepez  
   55   | Forobeta7  
   60   | Googl3

Tabla asignados
PHP:
id_asignado | id_curso | id_nivel | id_user
 45         | 1        | 1     |     54
 46         | 3        | 1     |     54
 58         | 2        | 2     |     54
 60         | 7        | 4     |     60
 94         | 7        | 3     |     54
 99         | 9        | 3     |     54
103         | 4        | 1     |     60
110         | 5        | 4     |     54
122         | 11       | 4     |     54


Teniendo en cuenta en el programa que básico=1, intermedio=2, avanzado=3, profesional=4

------------------------

Pero para que puede ser funcional en SQL se podría crear una tabla sobre niveles

Tabla niveles
PHP:
id_nivel | nombre_nivel
   1     | Básico  
   2     | Intermedio
   3     | Avanzado
   4     | Profesional

Bueno no creo que sea necesario la tabla niveles, ya que son apenas 4. Pero para tener una mejor normalización, seria necesaria la tabla niveles.

El id_asignado, no creo que sea necesario, ya que estamos haciendo una relación de muchos a muchos, pero igual al final no afecta en nada y puede ser funcional en algún futuro.

Ahora la pregunta del millón, a esto te referías como esta la FORMA 3?

o era otra forma :fatigue:


Gracias nuevamente por tu ayuda, saludos.
 
Última edición:
Justamente así era como mencionaba, quedó muy bien así :encouragement:. También creo que no es necesario el id_asignado pero si ves que a futuro lo puedes utilizar es mejor dejarlo. Simplemente cuando el user aumente de nivel en el curso se actualizará el id del mismo en la tabla Asignados. Creo que es muy necesario la tabla de niveles, por cuestiones de normalización. Así sea el genero de un usuario que ha de ser solo Masculino, Femenino y otro xD, debe crearse la tabla Genero.

Al final te quedan unos cuantos inner join en esa tabla así que no va a quedar tan pesada al ejecutarse.

Saludos
 
Justamente así era como mencionaba, quedó muy bien así :encouragement:. También creo que no es necesario el id_asignado pero si ves que a futuro lo puedes utilizar es mejor dejarlo. Simplemente cuando el user aumente de nivel en el curso se actualizará el id del mismo en la tabla Asignados. Creo que es muy necesario la tabla de niveles, por cuestiones de normalización. Así sea el genero de un usuario que ha de ser solo Masculino, Femenino y otro xD, debe crearse la tabla Genero.

Al final te quedan unos cuantos inner join en esa tabla así que no va a quedar tan pesada al ejecutarse.

Saludos

Gracias amigo por tu ayuda, ya que si no hubieras contestado hubiera pasado por alto la relación de tablas como la FORMA3, y hubiera elegido la FORMA1, solo por salir del paso.

Muy interesante lo que mencionas sobre el genero, no es solo de poner 1/0, ya que pueden haber otros como mencionas 😕

Pero si lo ideal era crear una tabla para que se entienda a que se refiere 1 o 0 a nivel de DB y no del programa.

Si eso era lo que quería al final, flexibilidad y que quedara lo menos pesada, con un par de registros no se nota, pero ya en miles o millones si que se nota una buena estructura y relación de datos.

Y exactamente solo unos inner join y ya estamos.

Bueno al final tengo que juntar otras tablas más, pero esta relación era mi duda, (todo por querer ahorra tiempo :grumpy🙂 me iba a salir caro al final.

Gracias nuevamente por tu ayuda, saludos. :encouragement:
 

Temas similares

Hyper
Respuestas
3
Visitas
160
iidps
I
Hyper
Respuestas
4
Visitas
132
Pinwino
Pinwino
Hyper
Respuestas
2
Visitas
114
Hyper
Hyper
Atrás
Arriba