sql >> Base de Datos >  >> RDS >> Database

¿Pueden existir múltiples claves primarias en una sola tabla?

  • ¿Qué son las claves?
    • Teclas simples
    • Claves concatenadas o compuestas
    • Claves primarias
      • Numeración y Auto-Incremento
  • ¿Puede una tabla contener varias claves primarias?

Si bien muchos desarrolladores y administradores de bases de datos pueden trabajar con primary keys todos los días, es un tema fascinante preguntarse a uno mismo:"¿Qué es exactamente es una primary key y puede (o debe) una tabla de base de datos contener varias primary keys simultáneamente?”

A continuación, examinaremos estas preguntas con más detalle e intentaremos llegar a un consenso razonable y generalmente acordado dentro de la comunidad de desarrollo.

¿Qué son las claves?

Para entender qué es una primary key está en una tabla de base de datos, primero debemos entender un poco sobre non-primary keys . Una key en una tabla es simplemente un atributo que se utiliza para identificar y acceder a esa información. Una tabla puede tener y, a menudo, tendrá varias claves, como en la tabla Users ambos email y username podrían considerarse claves.

Dependiendo del desarrollador o administrador con el que esté hablando, es posible que escuche sobre una variedad de tipos de claves y sus definiciones, por lo que solo cubriremos algunos ejemplos diferentes a continuación y una definición básica de cada uno.

Teclas simples

Una simple key es solo una clave que usa un solo atributo en la tabla. A menos que impongamos más restricciones sobre la clave o la tabla, entonces el username El atributo en el ejemplo anterior es una simple key .

Claves concatenadas o compuestas

Dando un paso más allá de simple keys están concatenated o compound llaves. Como su nombre lo indica, una concatenated key es una unión de múltiples single keys . Por ejemplo, el sistema puede combinar automáticamente el last_name y year_of_birth single keys en una concatenated key , así:smith1980 .

Claves primarias

Una [primary key](https://en.wikipedia.org/wiki/Unique_key) es una clave que ha sido elegida para ser la principal (o principal ) atributo representativo para esa fila de datos. La primary key es único y ese atributo luego se usa en toda la base de datos y se accede y se pasa a otras tablas como el atributo representativo de los datos en cuestión.

En la práctica, la primary key el atributo también está marcado como NOT NULL en la mayoría de las bases de datos, lo que significa que el atributo siempre debe contener un valor para que el registro se inserte en la tabla.

Como ejemplo, el email o username simple keys podría se le asigne la designación de la primary key , pero normalmente es una buena práctica configurar la primary key a un atributo que no es (o no podría) ser cambiado por la lógica comercial o incluso por el individuo. Por ejemplo, imagina un User obtiene una nueva dirección de correo electrónico, lo que hace que todas las primary key pasadas las asociaciones realizadas con la dirección de correo electrónico anterior dejen de ser válidas cuando se utilice la nueva dirección de correo electrónico.

Por esta razón (entre otras), la mayoría de las primary keys use un número o cadena única, como un [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier) .

Numeración y Auto-Incremento

También vale la pena señalar brevemente que muchos sistemas de bases de datos están configurados de tal manera que cada tabla tiene una primary key que es numérico y también se incrementa automáticamente. Esto simplemente significa que el propio motor de la base de datos asigna automáticamente a cada nuevo registro en esa tabla una primary key única. valor que es incrementalmente mayor que todos los valores anteriores. Sin embargo, la mayoría de los desarrolladores están de acuerdo en que esta práctica está desactualizada y expone fallas de seguridad innecesarias para el sistema cuando se usa para algunos tablas que representan ciertos datos.

Por ejemplo, imagina todos los User a los registros se les asigna una primary key de incremento automático valor, conocido como el id atributo. Si una persona malintencionada descubre que el id atributo de un usuario determinado (por ejemplo, John Smith) es el valor 1500 , esto ya expone un poco de información. Primero, indica que es probable que haya un mínimo de al menos 1499 otros usuarios en el sistema, o que lo hayan estado en algún momento. También significa que si se puede acceder a la página de usuario de John Smith a través de una URL o una llamada API que contiene ese id valor de 1500 , entonces existe una buena posibilidad de simplemente cambiar el valor a otro número, como 1499 o 1501 , expondrá la página de otro usuario que puede no querer que este visitante acceda a su página. De esta manera, los registros se pueden consultar simplemente adivinando el id valores a escala masiva.

Obviamente, estos son ejemplos muy simples, pero por estas razones, la mayoría de las bases de datos modernas usarán una primary key única y aleatoria. valor de atributo como un UUID cuando se trabaja con datos confidenciales.

¿Puede una tabla contener varias claves primarias?

La respuesta corta es no , no se permite que una tabla contenga varias primary keys , ya que va en contra de los principios fundamentales del diseño de bases de datos relacionales (ver:[database normalisation](https://en.wikipedia.org/wiki/Database_normalisation) y [Third normal form](https://en.wikipedia.org/wiki/Third_normal_form) ).

Es es es posible que una tabla tenga varias candidate keys , que efectivamente se comportan de manera similar a una primary key en eso una candidate key es único, NOT NULL , y es una representación singular de ese registro de tabla.

Sin embargo, cuando se trata de seleccionar cuál uno el atributo se asignará como la primary key para la tabla, la elección proviene de la lista de todas las posibles candidate keys (de ahí el nombre, son candidatos para convertirse en una primary key ). En última instancia, solo una candidate key se selecciona como el mejor atributo representativo para ese registro, para ser utilizado en esta tabla como la primary key y referenciado en otra parte de la base de datos por otras tablas a través de sus respectivas foreign keys .