Mostrando entradas con la etiqueta Base de datos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Base de datos. Mostrar todas las entradas

Llaves compuestas Vs. Llaves exógenas

Durante mis años como ingeniero he trabajado en unas cuantas compañías de tecnologías de la información y de desarrollo de sistemas de información. Durante este período he trabajado desde un programador "raso" hasta la dirección de proyectos de software y claro está muchas veces he tenido que modelar bases de datos para muchos sistemas.

Ahora que interpreto un papel diferente,esta vez como profesor universitario, una de las asignaturas que imparto es justamente "Bases de datos", para lo cual me he propuesto en fortalecer principalmente las habilidades para el diseño de las bases de datos de mis alumnos. Es justo en una de estas clases donde un alumno plantea la cuestión que es objetivo de este post.

Image courtesy of suphakit73 - FreeDigitalPhotos.net
Quizá para muchos esta cuestión tiene poco de cuestión, ya que los mecanismos y reglas que permiten que la información que almacenamos en nuestras bases de datos sean consistentes, permiten dar respuesta a esto, sin embargo, planteada la cuestión aparecieron con ella algunos planteamientos "necios" y es por esto que escribo esta entrada para intentar zanjar la discusión.

 

 

 

 

 

Llaves compuestas Vs. Llaves exógenas

Antes de realizar una comparativa entre las 2 es justo explicar que significa cada una.

Llaves primarias (Primary Keys):

La llave primara es un atributo o un conjunto de atributos que por si mismos son únicos dentro de un conjunto de representaciones o instancias de una entidad y por ende sirven para identificar de forma univoca dicha representación de cualquier otra.

Un ejemplo de una llave primaria puede ser el número de documento de identificación de una persona puesto que este dato es exclusivo para la persona dueña de él y ninguna otra persona podrá tener un número igual. Si tuviéramos una tabla en una base de datos donde se almacene la información de las personas, cada registro de esta tabla (instancia de la entidad) se diferenciaría de los demás, al menos, porque el número de documento es diferente.

Llaves compuestas:

Como se mencionó anteriormente una llave primaria, o en otras palabras los atributos que identifican de forma univoca una instancia de una entidad de sus semejantes, puede ser la combinación de más de un atributo. Este caso es muy frecuente cuando se crean tablas intermedias debido a una relación "Muchos a muchos" en un modelo entidad relación.

Por ejemplo, Supongamos que es necesario almacenar la nota final de cada alumno para cada una de las asignaturas que ha tomado. En tal caso tendremos lo siguiente:
Para llevar este modelo a una base de datos se requiere una tabla intermedia que relacione el alumno con la materia. Es importante hacer énfasis en que un alumno solo puede tener una nota final para cada materia, esto significa que según la naturaleza de nuestra información la llave natural de esta nueva tabla es la la combinación de las llaves del alumno y de la materia, puesto que un alumno no puede tener más de una nota para la misma materia. Así pues se la nueva tabla tendrá una llave compuesta por las 2 columnas cuya combinación es irrepetible y por tanto identifica de forma univoca cada instancia (registro) de las demás, quedando así:


Como se puede ver, la tabla notas tiene la llave primaria compuesta, de esta forma cada alumno solo podrá tener una nota final por cada asignatura.

Llaves exógenas:

El término exónego hace referencia a que los datos allí almacenados no hacen parte directa de la entidad que van a identificar, es decir, que es un valor obtenido de forma externa a la entidad misma. En otras palabras, es crear un dato que se pretenda irrepetible y asignarlo como llave primaria de una tabla. Esto tiene utilidad cuando no logramos encontrar un atributo o un conjunto de ellos que permita identificar de forma univoca cada instancia de la entidad.

Sin embargo, y es esta la cuestión planteada en clase, algunos diseñadores usan un id (genérico), normalmente un número consecutivo auto-generado, para identificar cada fila o registro de una tabla intermedia como la planteada en el punto inmediatamente anterior (Notas).

Bajo este criterio el modelo quedaría así:


Como se puede ver, la tabla notas tiene la llave primaria exógena, ya que se creo un atributo llamado "id_nota" para guardar un valor arbitrario que identifica cada registro del cruce de un alumno con cada materia para almacenar la nota.

Pero entonces...

¿Si tanto llaves compuestas como exógenas permiten identificar de forma univoca cada registro, por cuál nos inclinamos?

Si bien es cierto que las 2 formas permiten identificar de forma univoca cada instancia de las entidades o en otras palabras cada registro de una tabla, es necesario considerar un punto que es irrebatible y que afecta directamente la congruencia y consistencia de nuestros datos. Para explicar de forma clara en que consiste la inconsistencia usemos el mismo ejemplo anterior.

Se debe recordar que se definió que un alumno solo puede tener una única nota final por cada materia, por tal motivo quién modele la base de datos no debería permitir que aun alumno tenga más que una nota por cada materia.

Si se usa una llave exógena estaríamos permitiendo de forma implícita que un alumno pueda tener más de una nota para la misma materia, ya que no existe una restricción que impida que la combinación entre alumno y materia se repita y por tanto tendríamos algo así:


Como se puede evidenciar en la columna "id_nota" no hay datos repetidos ya que la restricción de la llave primaria lo impide, sin embargo, se permite que el alumno con documento 10 tenga 2 notas para la materia 5, esto por supuesto es una incongruencia en nuestra información.
Por otro lado, si se usa una llave compuesta esta incongruencia en nuestra información no puede existir ya que la llave natural, es decir lo que no se puede repetir, se está usando explícitamente como llave primaria de la tabla y por tanto tendríamos algo así:


Como se puede evidenciar el alumno 10 aparece más de una vez (una por cada materia), de igual manera la materia, sin embargo la combinación de las dos solo existe una vez ya que la llave primaria compuesta así lo exige.

Claro, algunos dirán que el problema de la incongruencia de la información que permiten las llaves exógenas se pueden solucionar de otras formas, por ejemplo el uso de una llave única (UK) adicional compuesta de las columnas que no se pueden repetir, pero esto no deja de ser una tontería ya para eso se define la UK como PK. Alguno otro dirá que eso lo puede controlar el software, y que puedo decir: POS SI!! igual que una puerta cerrada evita que se entren los ladrones y todo irá bien hasta que alguien se deje una ventana abierta.

Dicho lo anterior, está claro que se debe usar lo que llamo "llave natural", es decir, aquella que es parte propia de la entidad en lugar de un dato exógeno. Esta "filosofía" no solo aplica para las tablas intermedias, sino que también se debería aplicar a cualquier entidad y dejar la fea costumbre de poner un campo llamado "id" a cuanta tabla veamos (Cosas que algunos hacen ya de forma instintiva y casi diría que irracional).


Dedicado a mi amigo J.P.

BackUp y Restauración en MS-SQL Server

Una de las tareas más comunes que se desarrollan con bases de datos sobre todo en ambientes de desarrollo, es hacer la copia de seguridad (backup) y restaurarlo para continuar con su uso.


Les dejo un corto vídeo que muestra 2 formas de realizar esta tarea. 2 Formas para hacer Backups y restaurar los mismos en bases de datos SQL Server de Microsoft.



La primera forma se podría decir que es la manera estándar de hacer un backup, en tanto que la segunda es más útil para migración entre versiones de servidores o incluso a otros motores de bases de datos.

Repaso de Conceptos Bases de datos

En esta entrada se podrá encontrar un serie de conceptos sobre base de datos que permitirá a los alumnos recordar o conocer algunos lo que se debe saber sobre las bases de datos.

  • ¿Qué es un dato?
Es la representación de un atributo, propiedad o cualidad de un elemento. Un atributo puede ser de cualquier tipo aunque en bases de datos computarizadas están limitadas a los que puede manejar un computador: números, fechas, texto, etc.

Los Datos son los ladrillos de la información.
  • ¿Qué es una base de datos?
Es un conjunto de datos organizados que pertenecientes a un contexto le dan carácter de información y siendo almacenados de manera sistemática permitirán su uso posterior, ya sea parcial o totalmente.
  • ¿Qué es una entidad?
Es todo aquello que "Representa una “cosa” u  “objeto”  del mundo real con existencia independiente, es decir, se diferencia unívocamente de otro objeto o cosa, incluso siendo del mismo tipo, o una misma entidad."
  • ¿Qué es un atributo?
"Los atributos son las características que definen o identifican a una entidad."
  • ¿Qué es una tabla?
Es la forma en que las bases de datos relacionales representan las entidades.
  • ¿Qué una columna?
Es la forma en que las bases de datos relacionales representan los atributos de las entidades, son los campos que podrá tener cada instancia (fila) en una tabla. 
  • ¿Qué es una fila / tupla?
Es la forma en que las bases de datos relacionales representan una instancia de una entidad. 
  • ¿Qué es una relación?
Es lo que permite identificar las dependencias entre entidades y la forma en que están asociada.

Las relaciones pueden ser de la siguiente naturaleza:

Uno a Uno (1:1): Una entidad de A se relaciona únicamente con una entidad en B y viceversa (ejemplo relación vehículo - matrícula: cada vehículo tiene una única matrícula, y cada matrícula está asociada a un único vehículo).

Uno a muchos (1:N): Una entidad en A se relaciona con cero o muchas entidades en B. Pero una entidad en B se relaciona con una única entidad en A (ejemplo vendedor - ventas).

Muchos a Muchos (N:M): Una entidad en A se puede relacionar con 0 o muchas entidades en B y viceversa (ejemplo asociaciones- ciudadanos, donde muchos ciudadanos pueden pertenecer a una misma asociación, y cada ciudadano puede pertenecer a muchas asociaciones distintas)
  • ¿Qué es e modelo Entidad - Relación?
Es la forma en que se puede representar gráficamente las entidades sus atributos y las relaciones entre ellas en un diagrama (Ejemplo). Simbología:

Entidad: Se representa mediante un rectángulo con el nombre en el interior.

Atributo: Se representa mediante una elipse con el nombre en el interior, unida a la entidad por una línea. Normalmente no suelen ir en el diagrama ya que pueden saturar el modelo dificultando su lectura.

Relación: Se representan mediante un rombo que se une a las entidades por medio de líneas, en el interior del rombo debe ir un verbo.
  • ¿Formas normales?
"Las formas normales o reglas de normalización están diseñadas para prevenir anomalías de actualización e inconsistencia de datos."


Existen 5 formas normales, aunque con las 3 primeras es suficiente para la mayoría de las necesidades del diseño de una base de datos.

1a Forma Normal: Todas las instancias de un tipo de entidad deben tener la misma cantidad de atributos, adicionalmente se descarta el uso de atributos repetidos. Es decir que  se enfoca en la forma que deberá tener cada fila de la tabla.  

2a Forma Normal:

Una tabla 1NF está en 2NF si y solo si, dada una clave primaria y cualquier atributo que no sea un constituyente de la clave primaria, el atributo no clave depende de toda la clave primaria en vez de solo de una parte de ella. Esto es especialmente relevante cuando la clave primaria consiste en la agrupación de más de una columna, ya que si la llave principal de tabla está compuesta por una única columna la tabla cumple de manera implícita con la segunda forma normal.

Ejemplo de wikipedia:
_____________________________

_____________________________ 


3a Forma Normal:

"Una tabla está en 3NF si y solo si las dos condiciones siguientes se cumplen:
La tabla está en la segunda forma normal (2NF)
Ningún atributo no-primario de la tabla es dependiente transitivamente de una clave primaria"

Ejemplo de Wikipedia

_____________________________

_____________________________


4a Forma Normal:

Ejemplo de Wikipedia

_____________________________


_____________________________



5a Forma Normal:

Ejemplo de Wikipedia

_____________________________




_____________________________




  • ¿Qué es un DBMS?
Un DBMS es el sistema manejador de la base de datos, en otras palabras el el programa encargado de administrar todo lo referente con la base de datos, es el que gestiona el archivo de la base de datos, de tal manera que un desarrollador no se tenga que preocupar por crear la forma en que se recupera la información, como se va a almacenar e incluso otras cosas como el ordenamiento de los datos. Un DBMS también provee mecanismos para prevenir la inconsistencia de la información basados en las Formas Normales mencionadas anteriormente.

En el mercado existen diferentes Versiones y de diferentes fabricantes, entre los más populares están:
          * Oracle
          * MS-SQL
          * PostgreSQL
          * MySQL
 
  • ¿Qué es SQL?
Structure Query Lenguaje (SQL) al igual que cualquier lenguaje de programación consiste un un conjunto de instrucciones definidas o palabras reservadas, sin embargo, SQL está pensado y diseñado para poder interactuar de manera consistente con el DBMS. Con SQL se podrá realizar instruciones para consultar la información almacenada en la base de datos, insertar nueva información, actualizar la información existente o eliminarla, entre algunas otras funciones, aunque son estas 4 funciones las más habituales y se conocen con la sigla CRUD (Createm Read, Update y Delete).

Aunque existen varios DBMS la gran mayoría y los más populares aceptan y entienden el SQL de manera similar, aunque con algunas variaciones muy puntuales. Para mayor detalle vea SQL en la Wiki

  • Ejemplo de CRUD

Como se mencionó el CRUD son las 4 funciones básicas la interacción con los DBMS y a través de estos con la base de datos. A continuación se presentara un ejemplo de cada uno:
Create: Permite almacenar nueva información en la base de datos y se representa con la Instrucción Insert y su estructura es:
Insert Into [TABLA]([Campo1], [Campo2], [Campo...]) Values ([Valor1], [Valor2], [Valor..]);
por ejemplo: Insert Into Persona (Nombre, Fec_Nacimiento) Values ('Gabriel', '20000229');

Read: Permite consultar la información en la base de datos y se representa con la instrucción Select y su estructura es:
Select [Campo1], [Campo2], [Campo...]) From [TABLA] Where [Condición1] AND [Condicion...];
por ejemplo: Select Nombre, Fec_Nacimiento From Persona Where Documento = 1234567;

Update: Permite actualizar la información en la base de datos y se representa con la instrucción Update y su estructura es:
Update [TABLA] Set [Campo1] = [Valor1], [Campo2] = [Valor2], [Campo...] = [Valor...] Where [Condición1] AND [Condicion...];
por ejemplo: Update Persona Set Nombre = 'Gabriel' Where Documento = 1234567;

Delete: Permite eliminar información en la base de datos y se representa con la instrucción Delete y su estructura es:
Delete From [TABLA] Where [Condición1] AND [Condicion...];
por ejemplo: Delete From Persona Where Documento = 1234567;




Referencias:





Programación Orientada a Objetos (POO - en inglés OOP)

Image courtesy of digitalart - FreeDigitalPhotos.net La programación orientada a objetos es un paradigma o un modelo de programación qu...