Tengo dos mesas:
- Usuario (nombre de usuario, contraseña)
- Perfil (ID de perfil, sexo, fecha de nacimiento, ...)
Actualmente estoy usando este enfoque: cada registro de perfil tiene un campo llamado "userId" como clave externa que enlaza con la tabla de usuarios. Cuando un usuario se registra, su registro de perfil se crea automáticamente.
Estoy confundido con la sugerencia de mi amigo: tener el campo "userId" como clave externa y primaria y eliminar el campo "profileId". ¿Qué enfoque es mejor?
database
foreign-keys
primary-key
Duc Tran
fuente
fuente
Respuestas:
Las claves externas casi siempre son "Permitir duplicados", lo que las haría inadecuadas como claves primarias.
En su lugar, busque un campo que identifique de forma única cada registro de la tabla o agregue un campo nuevo (ya sea un entero de incremento automático o un GUID) para que actúe como clave principal.
La única excepción a esto son las tablas con una relación de uno a uno , donde la clave externa y la clave principal de la tabla vinculada son una y la misma.
fuente
Las claves primarias siempre deben ser únicas, las claves externas deben permitir valores no únicos si la tabla es una relación de uno a varios. Está perfectamente bien utilizar una clave externa como clave principal si la tabla está conectada mediante una relación uno a uno, no una relación uno a varios. Si desea que el mismo registro de usuario tenga la posibilidad de tener más de 1 registro de perfil relacionado, elija una clave primaria separada; de lo contrario, quédese con lo que tiene.
fuente
Sí, es legal que una clave principal sea una clave externa. Esta es una construcción rara, pero se aplica a:
una relación 1: 1. Las dos tablas no se pueden fusionar en una debido a los diferentes permisos y los privilegios solo se aplican a nivel de tabla (a partir de 2017, dicha base de datos sería extraña).
una relación 1: 0..1. El perfil puede existir o no, según el tipo de usuario.
el rendimiento es un problema y el diseño actúa como una partición: rara vez se accede a la tabla de perfiles, se aloja en un disco separado o tiene una política de fragmentación diferente en comparación con la tabla de usuarios. No tendría sentido si el almacenamiento de subrayado es columnar.
fuente
Generalmente se considera una mala práctica tener una relación de uno a uno. Esto se debe a que podría tener los datos representados en una tabla y lograr el mismo resultado.
Sin embargo, hay casos en los que es posible que no pueda realizar estos cambios en la tabla a la que hace referencia. En este caso, no hay ningún problema al utilizar la clave externa como clave principal. Puede ser útil tener una clave compuesta que consista en una clave primaria única de incremento automático y la clave externa.
Actualmente estoy trabajando en un sistema donde los usuarios pueden iniciar sesión y generar un código de registro para usar con una aplicación. Por razones que no voy a entrar, no puedo simplemente agregar las columnas requeridas a la tabla de usuarios. Así que voy por una ruta uno a uno con la tabla de códigos.
fuente
Sí, una clave externa puede ser una clave principal en el caso de una relación uno a uno entre esas tablas
fuente
Yo no haría eso. Mantendría la
profileID
clave principal de la tabla.Profile
Una clave externa es solo una restricción referencial entre dos tablas
Se podría argumentar que una clave primaria es necesaria como destino de cualquier clave externa que se refiera a ella desde otras tablas. Una clave externa es un conjunto de una o más columnas en cualquier tabla (no necesariamente una clave candidata, y mucho menos la clave primaria, de esa tabla) que puede contener los valores que se encuentran en la (s) columna (s) de clave primaria de algunos otra mesa. Por lo tanto, debemos tener una clave principal que coincida con la clave externa. ¿O debemos? El único propósito de la clave primaria en el par de clave primaria / clave externa es proporcionar una combinación inequívoca, para mantener la integridad referencial con respecto a la tabla "externa" que contiene la clave primaria referenciada. Esto asegura que el valor al que se refiere la clave externa siempre será válido (o nulo, si se permite).
http://www.aisintl.com/case/primary_and_foreign_key.html
fuente
Depende del negocio y del sistema.
Si su userId es único y será único todo el tiempo, puede usar userId como su clave principal. Pero si alguna vez desea expandir su sistema, le resultará difícil. Le aconsejo que agregue una clave externa en el usuario de la tabla para establecer una relación con el perfil de la tabla en lugar de agregar una clave externa en el perfil de la tabla.
fuente
Respuesta corta: DEPENDE .... En este caso particular, podría estar bien. Sin embargo, los expertos recomendarán no hacerlo casi siempre; incluyendo su caso.
¿Por qué?
Las claves rara vez son únicas en las tablas cuando son ajenas (originadas en otra tabla) a la tabla en cuestión. Por ejemplo, un ID de artículo puede ser único en una tabla ARTÍCULOS, pero no en una tabla PEDIDOS, ya que lo más probable es que el mismo tipo de artículo exista en otro pedido. Del mismo modo, los ID de pedido pueden ser únicos (podrían) en la tabla ORDERS, pero no en alguna otra tabla como ORDER_DETAILS, donde puede existir un pedido con varias líneas de pedido y, para consultar un artículo en particular en un pedido en particular, necesita la concatenación de dos FK (order_id y item_id) como PK para esta tabla.
No soy un experto en DB, pero si puede justificar lógicamente tener un valor generado automáticamente como su PK, lo haría. Si esto no es práctico, entonces una concatenación de dos (o quizás más) FK podría servir como su PK. PERO, no puedo pensar en ningún caso en el que un único valor de FK pueda justificarse como PK.
fuente