Saltar al contenido principal
LibreTexts Español

4.4: Diseñar una base de datos

  • Page ID
    155584
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)

    Diseñar una base de datos

    Supongamos que una universidad quiere crear una base de datos para rastrear la participación en clubes estudiantiles. Después de entrevistar a varias personas, el equipo de diseño se entera de que implementar el sistema es para dar una mejor idea de cómo la universidad financia los clubes. Esto se logrará rastreando cuántos miembros tiene cada club y qué tan activos son los clubes. El equipo decide que el sistema debe realizar un seguimiento de los clubes, sus integrantes y sus eventos. Con esta información, el equipo de diseño determina que se necesitan crear las siguientes tablas:

    • Clubes: esto rastreará el nombre del club, el presidente del club y una breve descripción del club.
    • Alumnos: nombre del alumno, correo electrónico y año de nacimiento.
    • Membresías: esta tabla correlacionará a los estudiantes con los clubes, lo que nos permitirá que cualquier estudiante se una a múltiples clubes.
    • Eventos: esta tabla hará un seguimiento de cuándo se reúnen los clubes y cuántos alumnos se presentaron.

    Ahora que el equipo de diseño ha determinado qué tablas crear, necesitan definir la información específica que contendrá cada tabla. Esto requiere identificar los campos que estarán en cada tabla. Por ejemplo, Nombre del Club sería uno de los campos en la tabla de Clubes. Nombre y Apellido serían los campos en la tabla Estudiantes. Por último, dado que esta será una base de datos relacional, cada tabla debe tener un campo en común con al menos otra tabla (en otras palabras: deben tener una relación entre sí).

    Para crear correctamente esta relación, se debe seleccionar una clave primaria para cada tabla. Esta clave es un identificador único para cada registro de la tabla. Por ejemplo, en la tabla Estudiantes, podría ser posible usar los nombres de los estudiantes para identificarlos de manera única. Sin embargo, es más que probable que algunos estudiantes compartan el apellido (como Mike, Stefanie o Chris), por lo que se debe seleccionar un campo diferente. La dirección de correo electrónico de un estudiante puede ser una buena opción para una clave primaria, ya que las direcciones de correo electrónico son únicas. Sin embargo, una clave primaria no puede cambiar, por lo que esto significaría que si los estudiantes cambiaban sus direcciones de correo electrónico, tendríamos que eliminarlos de la base de datos y luego volver a insertarlos, no una propuesta atractiva. Nuestra solución es crear un valor para cada estudiante —un ID de usuario— que actuará como clave primaria. También haremos esto para cada uno de los clubes estudiantiles. ¡Esta solución es bastante común y es la razón por la que tienes tantos ID de usuario!

    Puede ver el diseño final de la base de datos en la siguiente figura:

    Behaviorism_1.gif
    Figura\(\PageIndex{1}\): Flujo de diseño de datos. Imagen de David Bourgeois, Ph.D. está licenciado bajo CC BY 4.0

    Con este diseño, no solo tenemos una forma de organizar toda la información que necesitamos para cumplir con los requisitos, sino que también hemos relacionado con éxito todas las tablas juntas. Así es como podrían verse las tablas de la base de datos con algunos datos de muestra. Tenga en cuenta que la tabla Membresías tiene el único propósito de permitirnos relacionar a varios estudiantes con múltiples clubes.

    Behaviorism_1.gif
    Figura\(\PageIndex{2}\): Mesa: Clubes. Imagen de David Bourgeois, Ph.D. está licenciado bajo CC BY 4.0
    Behaviorism_1.gif
    Figura\(\PageIndex{3}\): Tabla: Alumnos. Imagen de David Bourgeois, Ph.D. está licenciado bajo CC BY 4.0
    Behaviorism_1.gif
    Figura\(\PageIndex{4}\): Tabla: Membresías. Imagen: por David Bourgeois, Ph.D. está licenciado bajo CC BY 4.0

    Normalización

    Al diseñar una base de datos, un concepto importante a entender es la normalización. En términos simples, normalizar una base de datos significa diseñarla de una manera que:

    • Reduce la redundancia de datos entre tablas más fácil de mapear
    • Saca datos inconsistentes.
    • La información se almacena en un solo lugar.
    • Da a la mesa la mayor flexibilidad posible.

    En el diseño de la base de datos Clubes Estudiantiles, el equipo de diseño trabajó para lograr estos objetivos. Por ejemplo, para rastrear las membresías, una solución simple podría haber sido crear un campo Miembros en la tabla Clubes y luego enumerar todos los nombres de los miembros. No obstante, este diseño significaría que si un estudiante se uniera a dos clubes, entonces su información tendría que ser ingresada por segunda vez. En cambio, los diseñadores resolvieron este problema utilizando dos tablas: Estudiantes y Membresías.

    En este diseño, cuando un estudiante se une a su primer club, debemos agregar al alumno a la tabla Estudiantes, donde se ingresa su nombre, apellido, dirección de correo electrónico y año de nacimiento. Esta adición a la tabla Estudiantes generará una identificación de estudiante. Ahora agregaremos una nueva entrada para denotar que el estudiante es un miembro específico del club. Esto se logra agregando un registro con el ID de estudiante y el ID del club en la tabla Membresías. Si este estudiante se une a un segundo club, no tenemos que duplicar el nombre del estudiante, el correo electrónico y el año de nacimiento; en cambio, solo necesitamos hacer otra entrada en la tabla de Membresías de la identificación del segundo club y la identificación del estudiante.

    El diseño de la base de datos de Student Clubs también facilita el cambio del diseño sin mayores modificaciones en la estructura existente. Por ejemplo, si se le pidiera al equipo de diseño que agregara funcionalidad al sistema para rastrear a los asesores de profesores a los clubes, podríamos lograrlo fácilmente agregando una tabla de Asesores de Facultad (similar a la tabla Estudiantes) y luego agregando un nuevo campo a la tabla Clubs para contener la ID de Asesor de Facultad.

    Tipos de datos

    Al definir los campos en una tabla de base de datos, debemos darle a cada campo un tipo de datos. Por ejemplo, el campo Año de Nacimiento es un año, por lo que será un número, mientras que Nombre será texto. La mayoría de las bases de datos modernas permiten almacenar varios tipos de datos diferentes. Algunos de los tipos de datos más comunes se enumeran aquí:

    • Texto: para almacenar datos no numéricos que sean breves, generalmente bajo 256 caracteres. El diseñador de la base de datos puede identificar la longitud máxima del texto.
    • Número: para almacenar números. Por lo general, se seleccionan algunos tipos de números diferentes, dependiendo de qué tan grande sea el número más grande.
    • Sí/No: una forma especial del tipo de datos numéricos que es (generalmente) de un byte de longitud, con un 0 para “No” o “Falso” y un 1 para “Sí” o “Verdadero”.
    • Fecha/Hora: una forma especial del tipo de datos numéricos puede interpretarse como un número o una hora.
    • Moneda: una forma especial del tipo de datos numéricos que formatea todos los valores con un indicador de moneda y dos decimales.
    • Texto de párrafo: este tipo de datos permite textos de más de 256 caracteres.
    • Objeto: este tipo de datos permite el almacenamiento de datos que no se pueden ingresar a través de teclados, como una imagen o un archivo de música.

    La importancia de definir adecuadamente el tipo de datos es mejorar la integridad de los datos y la ubicación de almacenamiento adecuada. Debemos definir correctamente el tipo de datos de un campo, y un tipo de datos le dice a la base de datos qué funciones se pueden realizar con los datos. Por ejemplo, si deseamos realizar funciones matemáticas con uno de los campos, debemos decirle a la base de datos que el campo es un tipo de datos numéricos. Entonces, si tenemos un campo que almacena el año de nacimiento, podemos restar el número almacenado en ese campo del año en curso para obtener la edad.

    También se debe identificar la asignación de espacio de almacenamiento para los datos definidos. Por ejemplo, si el campo Nombre se define como un tipo de datos de texto (50), se asignan cincuenta caracteres por cada nombre que queremos almacenar. No obstante, aunque el nombre de pila tenga sólo cinco caracteres, se asignarán cincuenta caracteres (bytes). Si bien esto puede no parecer un gran problema, si nuestra tabla termina conteniendo 50,000 nombres, asignamos 50 * 50,000 = 2,500,000 bytes para el almacenamiento de estos valores. Puede ser prudente reducir el tamaño del campo, por lo que no desperdiciamos espacio de almacenamiento.