Una de las característica de que debe tener cualquier tabla en una base de datos es que cualquier registro dentro de ella debe ser único, es decir, no debe haber dos registros iguales. Esta característica hace que una tabla cumpla con las Reglas de Codd (regla 2 del acceso garantizado), pero sobre todo hace que hace que se evite la duplicidad de registros y con ello la redundancia de información (una de las características de un SGBD).
La unicidad de registros se logra configurando la tabla para que no acepte registros duplicados, que haya alguna manera de ubicar de manera única cada registro, y eso se logra verificando que haya un campo en la tabla-o combinación de campos- que no se puedan repetir en toda la tabla, que se asegure esa unicida por medio de una regla dentro de la misma tabla que impida por completo los registros duplicados. Lo importante de definir la unicidad de registros es detectar qué campo o campos logran la unicidad. Para ello se tiene que hacer un análisis de los campos y detectar la que se llamará llave primaria, o campo(s) que no se pueden repetir en dos registros de la misma tabla.
Unicidad de registro con un solo campo
Lo ideal es que encontremos un solo campo que sepamos que no se puede repetir en toda la tabla. Pueden existir varios de estos tipos de campo, y será decisión del DBA o de quien diseñe la tabla determinar cuál es el mejor.
Ejemplos
En el caso de una tabla de alumnos que contenga los siguientes campos
- Nombre (campo tipo texto).
- Apellidos (campo tipo texto).
- Domicilio (campo tipo texto).
- Año que cursa (campo tipo entero).
- Número de boleta o de matrícula (campo tipo texto o numérico, dependiendo de las reglas de la escuela).
- Fecha de nacimiento (campo tipo fecha).
- Sexo (campo tipo texto).
- Estatus para saber si está activo o no (campo tipo texto o numérico).
- Calificación promedio actual ( (campo tipo numérico de punto flotante).
¿Existe un campo que pueda ser único en toda la tabla?. Haciendo un análisis de los campos podemos determinar que
- El campo Nombre por si solo no le da unicidad al registro ya que solo contiene el nombre de pila del alumno y varias alumnas se pueden llamar «Laura» o varios alumnos se pueden llamar «Juan». Nombre no es buen candidato a darle unicidad al registro.
- El campo de Apellidos tampoco es un candidato a darle unicidad de registros ya que si entraran dos hermanos tendrían el mismo valor en este campo (el caso de hermanos o hermanas es el más claro, pero más de una persona pueden tener los mismos apellidos sin tener parentesco necesariamente).
- El Domicilio tampoco es único, varias personas pueden vivir en el mismo domicilio en un mismo momento, o a lo largo de la historia, por lo que este campo tampoco es candidato para darle unicidad al registro.
- El Año que se cursa tampoco es único, ya que muchos alumnos cursan el mismo grado a un mismo tiempo.
- El Número de boleta o de matrícula es un buen candidato, y la razón es por que una escuela siempre se asegura de que este número sea único, de tal manera que cualquier alumno se puede identificar -desde que se inscribe- con un número único e irrepetible. Ese número por tanto sirve para identificar unívocamente al alumno a lo largo de la historia de la escuela.
- Los demás campos tampoco son candidatos, ya que dos personas que nazcan el mismo día tendrán el mismo valor en el campo de Fecha de nacimiento; la mitad de los alumnos tendrán el mismo valor en el campo de Sexo; el campo de Estatus solo tiene dos valores (Activo/Inactivo) y Calificación promedio tampoco es única ya que varios alumnos pueden tener el mismo valor en dicho campo.
Otro ejemplo.
En el caso de una función de cine, donde se tienen los campos
- Película (campo de tipo texto).
- Día y Hora (campo de tipo fecha o tiempo).
- Duración (campo de tipo numérico, probablemente de punto flotante, o de tipo tiempo).
- Precio del boleto (campo de tipo numérico).
- Sala donde se proyecta (campo de tipo texto o numérico, depende de quien modele la base de datos).
No existe un campo que por sí solo le dé unicidad al registro de cada función (la misma película está en varias salas, el día-hora se repite si hay dos funciones al mismo tiempo en diferentes salas, la duración no es un valor irrepetible a lo largo de la historia, en la misma sala se presentan varias películas durante la historia del cine, etc.) por lo que en ocasiones se tienem que escoger varios campos que juntos le den unicidad al registro.
Unicidad de registro con combinación de campos
En el ejemplo anterior se tiene que intentar encontar un campo, sino que se deben encontrar una combinación de dos o más campos que en conjunto le den unicidad al registro.
Lo primero que se debe intentar es encontrar un conjunto de 2 campos, si no se encuentra una combinación de 2 campos que le den unicidad al registro, se debe buscar con conjunto de 3, luego de 4 y así hasta encontrar las combinaciones de campos que le otorguen la propiedad de unicidad al registro.
En el caso del ejemplo de las funciones en una sala de cine se pueden hacer los siguientes razonamientos en conjunto de dos campos:
- Película y día-hora ¿le dan unicidad al registro? ¿Se puede ofrecer la misma película en el mismo momento? La respuesta es si, si consideramos que se puede tener más de una Sala ofreciendo la misma película en el mismo horario (situación que se presenta cuando se tratan de estrenos que tienen gran demanda, por ejemplo).
- ¿Duración y Precio del boleto? Obviamente si se puede repetir el mismo precio para películas que duren lo mismo.
- ¿Sala y Precio? Igual que el punto anterior, no le da unicidad al registro.
- ¿Pelicula y Sala? Tampoco le da unicidad al registro ya que la misma película se puede ofrecer en la misma sala, pero en día o en hora diferente.
¿Se tendrá que buscar en conjuntos de 3 campos? Quizá no si contemplamos la combinación de Sala + Fecha-hora; esta combinación si le da unicidad al registro ya que en la misma sala y a la misma hora no se pueden ofrecer dos funciones.
Por esto la combinación de 2 campos que nos pueden dar registros irrepetibles en toda la tabla son Sala y Fecha-hora de la función.
Un ejemplo más
En México existe un servicio de información basado en un centro de atención telefónico para la ciudadanía llamado Locatel. Entes servicio se atienden llamadas telefónicas las 24 horas del día para resolver dudas sobre programas de gobierno, solicitud de diversos servicios y para seguimiento a trámites de algunas dependencias del gobierno. Durante algún tiempo publicaron un conjunto de datos abiertos que contenía -para cada registro- los siguientes datos
- Día (año, mes y día)
- Nombre del Servicio solicitado (texto de la solicitud realizada)
- Clave del servicio solicitado (clave de la solicitud realizada)
Siguiendo con el análisis realizado en los dos casos anteriores, determinemos el campo o campos que le dan unicidad al registro.
Buscando unicidad con un solo campo
¿Existe algún campo que por sí solo le de unicidad al registro? ¿día, servicio o clave? Evidentemente no (el mismo día se hacen muchas llamadas, un servicio es solicitado muchas veces, y la clave es un conjunto finito de valores que también se puede repetir)
Buscando unicidad con conjuntos de dos campos
Dado de las combinaciones son pocas, analicemos cada una de ellas
- Dia + Servicio. No puede obtenerse unicidad ya que el mismo día se pueden hacer solicitudes del mismo servicio. Aún y cuando el primer campo tuviera un detalle de hora,minuto, segundo e incluso fracción de segundo (que no era el caso) no se puede obtener unicidad, ya que se trata de un Call center con muchas personas atendiendo solicitudes, por lo que en el mismo momento se puede iniciar la atención de avarias llamadas.
- Día + Clave de servicio. Es el mismo caso del punto anterior ya que la Clave es del servicio es un catálogo pequeño.
- Clave y Nombre del Servicio nunca le dará unicidad ya que el mismo tipo de servicio solicitado se puede hacer varias veces, durante varios días.
Buscando unicidad con conjuntos de tres campos
Ya que no se encontró un campo que por si solo le de unicidad al registro, y que ninguna combinación de dos campos sirve, es necesario buscar combinaciones de tres campos. Y como el registro consta de tres campos tendremos que probar con todo el registro.
¿Si se juntan los tres campos de la tabla se logra la unicidad? La respuesta es No, tampoco se puede garantizar que aún juntando los tres campos se logre la unicidad. En ese caso ¿que se debe de hacer? Esta es una tabla que no puede garantizar la unicidad de sus registros, por lo que es una tabla a todas luces mal diseñada, no cumple con la primera forma normal de las tablas en una base de datos relacional.
En esta situación, se puede optar por dos caminos:
- Se rediseña la tabla para que se garantice la unicidad
- Se genera un campo artificial para asegurar la unicidad
Estas dos situaciones se deberán analizar cuando se vean las llaves primarias y las formas normales.
¿Cómo configurar las tablas en SQL para forzar la unicidad?
Una vez determinado que una tabla tiene la propiedad de unicidad de registros, y que se han encontrado las llaves candidatas (y por tanto la llave primaria) se forzará la unicidad de registros con el CONSTRAINT UNIQUE en la tabla, y con la PRIMARY KEY al momento de crear o modificar las tablas con los comandos DDL correspondientes.