¿Debería exponerse una clave sustituta a un usuario?

14

A menudo, en una tabla que no tiene una clave natural, sigue siendo útil para que los usuarios puedan tener un identificador generado de forma única. Si la tabla tiene una clave primaria sustituta (y, en tal caso, es de esperar), ¿se debe exponer esa clave al usuario o se debe utilizar otro campo para ese propósito?

Una razón para no exponer la clave sustituta es que ahora no puede realizar operaciones que preserven la relación entre los registros, sino cambiar los valores clave, como ciertos tipos de eliminación / reinserción, muchos métodos para copiar datos de una base de datos a otro, etc.

La principal ventaja de exponer la clave sustituta es la simplicidad de usar un campo que tiene de todos modos.

¿En qué circunstancias es mejor exponer directamente la clave sustituta a los usuarios?

psr
fuente
Parte de esta pregunta es que necesita definir 'usuarios'. Los usuarios pueden ser consumidores de una API que exponga o seres humanos carnosos. La respuesta no será la misma para ambos.
James Snell
1
Seres humanos carnosos.
psr
Cada situación en la que los datos se puedan identificar de manera diferente debe tener un identificador diferente. Entonces, si un nuevo sistema se conecta con sus datos, espere que tenga su propio PK y agréguelo a sus datos. La visibilidad de las "bolsas feas de agua en su mayoría" cuenta como un "sistema" para este escenario. Mi solución preferida es almacenar las claves y las marcas de tiempo (agregar, cambiar y eliminar) para las entidades en una tabla especial. De esta manera, los datos se pueden distribuir fácilmente.

Respuestas:

10

Debe estar preparado para cualquier identificador que esté expuesto a los usuarios / clientes que necesitan ser cambiados, y cambiar la identidad de una fila en una base de datos y propagar ese cambio a todas las claves foráneas es solo pedir que se rompan los datos.

Si los datos no tienen una clave comercial natural, puede agregar un campo adicional para un "identificador comercial". Esto debe optimizarse para los procesos para los que se utiliza. La entrada del teclado telefónico solo significa numérico. Por teléfono / verbal significa evitar símbolos de sonido similares (B / D, M / N, etc.). Incluso puede autogenerar alguna frase fácil de recordar ("gelatina verde").

El efecto de esto es que la empresa luego puede cambiar la forma en que quieren referirse a los registros, y el único cambio en el esquema de datos es agregar una nueva columna para ese estilo de identificación o transformar los identificadores que ya existen. El cambio no se propaga a través de toda la base de datos, y aún tiene una identificación (el sustituto) que es válida con el tiempo.

En resumen, evitaría exponer claves sustitutas a los usuarios. Como señalan los comentarios, las claves sustitutas casi nunca deberían cambiar. Por el contrario, las empresas quieren cambiarlo todo. Si se expone la clave sustituta, es solo cuestión de tiempo antes de que la empresa quiera cambiarla.

Como nota al margen, cuando digo "exponer" aquí, me refiero a darle la clave al usuario con la expectativa de que la use directamente (como llamar para solicitar asistencia con su número de pedido).

Chris Pitman
fuente
55
Esta respuesta no tiene sentido. Las claves sustitutas nunca cambian, y no ha defendido no exponerlas a los usuarios.
Robert Harvey
1
Nunca digas nunca. ¿Qué pasa si este último diseño conduce a una consolidación récord? ¿Qué sucede si necesita aumentar el tamaño y alejarse de las identidades?
DougM
3
@DougM: luego escriba los registros en una nueva tabla consolidada con su propia clave sustituta, y mantenga las claves originales en campos separados en la nueva tabla (y un campo que identifique la tabla fuente original) como referencias, si es necesario. Ese tipo de consolidación debería ser extraordinariamente raro, y solo como resultado de un diseño fallido. Repita después de mí: sustituto. Llaves. Nunca. Cambio. Por eso son sustitutos.
Robert Harvey
2
@RobertHarvey Estoy de acuerdo en que las claves sustitutas nunca deberían cambiar, por eso creo que son identificadores externos deficientes. Eventualmente, un cliente querrá cambiar cómo se refieren a un registro. En ese momento, ha construido todo su sistema en torno a claves sustitutas inmutables o ha pensado en el futuro y ha puesto un nivel de indirección entre los identificadores comerciales y las claves sustitutas.
Chris Pitman
2
@sqlvogel: ¿Aclararía las cosas si usara el término "clave primaria generada por el sistema" en lugar de "sustituto"? Estoy de acuerdo en que es posible que desee cambiar el algoritmo que genera las claves sustitutas, pero eso no cambia su calidad fundamentalmente inmutable.
Robert Harvey
4

En algunos casos, se esperan claves sustitutas y tienen sentido para los usuarios. Mi ejemplo favorito es el "número de pedido". El número de pedido no es realmente una clave natural: una clave natural puede ser la marca de tiempo más el usuario, o tal vez más que eso si espera que los usuarios generen más de un pedido dentro de la granularidad de su marca de tiempo.

No obstante, los usuarios entienden y esperan la conveniencia de un número de pedido. No hay ningún daño y mucho valor si les informa a los usuarios sobre ellos.

Por otro lado, algunas claves sustitutas no tienen sentido para un usuario. Claro, mi compañía de seguros de salud tiene una clave sustituta que me identifica según mi identificación de miembro, fecha de nacimiento, compañía, etc., pero no me importa eso, me importa la información de mi tarjeta (que a menudo incluye identificadores basados en mi empleador y no son únicos en todo el universo ... De ahí la clave sustituta en la compañía de seguros).

Alan Shutko
fuente
Si un usuario lo comprende y espera interactuar con él, ya no es una clave sustituta. Las claves sustitutas se definen como sin sentido comercial. El hecho de que sea un número de identificación no significa necesariamente que sea un sustituto. Además, "alguna clave sustituta que me identifique en función de mi identificación de miembro, fecha de nacimiento" [...] no tiene sentido. ¿Estás diciendo que su clave sustituta (que no tiene significado comercial) te identifica en base a cosas que podrían componer una clave natural?
Kyle McVay
A menudo, lo que sucede es que se le da un número de identificación de empleado para que en el sistema de empleados se diferencie de otras personas con el mismo nombre. En su tarjeta de seguro, puede incluir su identificación de empresa y empleado. Pero la compañía de seguros de salud a menudo generará su propia identificación interna que puede usar en todos sus sistemas en lugar de usar el nombre, la fecha de nacimiento y las identificaciones de los empleados que recibe de su empleador. ¿Estas claves generadas son sustitutas o claves naturales? Depende de a quién le pregunte (marque 2 definiciones alternativas en en.wikipedia.org/wiki/Surrogate_key )
Alan Shutko
1

Solo debe exponer una clave sustituta si es un GUID / UUID * generado correctamente. La exposición de claves sustitutas secuenciales es el número 4 en los 10 principales problemas de seguridad de OWASP.

* En la práctica, es mejor suponer que no se generó correctamente para estos fines a menos que sepa que fue creado por un generador de números aleatorio o pseudoaleatorio criptográficamente seguro.

Peter Taylor
fuente
2
No está claro a partir de su respuesta cómo un GUID mejora la seguridad.
Robert Harvey
1
@RobertHarvey: supongo que no son secuenciales y no se pueden adivinar.
Bobson
@RobertHarvey, aclaró.
Peter Taylor
1

Si una tabla no tiene clave natural, las claves sustitutas permiten filas como esta.

surrogate_key  some_name
--
1              Wibble
2              Wibble
...
17             Wibble
...
235            Wibble

Llamaría a estas claves artificiales en lugar de claves sustitutas, pero esa distinción no es importante para esta pregunta.

Ahora, suponiendo que hay datos importantes que hacen referencia a estas claves sustitutas a través de claves externas, ¿cómo sabrían los usuarios finales qué fila actualizar si no conocen los valores de las claves sustitutas?

Mike Sherrill 'Retiro del gato'
fuente
Es un poco contradictorio etiquetar la columna como "clave sustituta" pero luego decir que son "claves artificiales en lugar de claves sustitutas". Si llama a estas claves artificiales porque no tienen un significado comercial y solo sirven como identificadores únicos, entonces esta clave debe naturalizarse (exponerse) y debe crearse una nueva clave sustituta. es decir, cambie el nombre de la clave sustituta naturalizada a algo con significado comercial, exponga a los clientes y cree una nueva columna similar para ser la verdadera sustituta de las operaciones internas. Menos que ideal, pero aún mejor que exponer a un verdadero sustituto.
Kyle McVay
@KyleMcVay: no es contradictorio. Honra el significado de sustituto , cuya idea esencial es "sustituir". Una clave sustituta sustituye a una clave natural. (Codd y la teoría relacional en general usa la clave sustituta en este sentido). Una tabla que no tiene clave natural no puede tener una clave sustituta en ese sentido. Pero puede tener un valor arbitrario que se utiliza en lugar de cualquier otra cosa. Eso es lo que yo llamaría una llave artificial.
Mike Sherrill 'Cat Recall'
Sus definiciones no son inexactas, pero creo que la clave sustituta ha adquirido un significado adicional específico de la industria más allá de la palabra sustituto . Si va a exponer una clave a un cliente, diría que esa clave ahora tiene un significado comercial; se ha naturalizado y ahora debería considerarse lógicamente parte de la entidad que representa. Según esta lógica, no existe una clave sustituta expuesta. Si va a exponer una clave artificial, ya no es una clave sustituta y necesita una nueva.
Kyle McVay
0

En palabras simples:

  • Los sustitutos deben estar ocultos para el usuario.
  • Debe exponer alguna otra clave de candidato comercial al usuario.
  • Si no existe otra clave candidata, debe mostrar la PK. Pero en este caso, el PK no se considera un sustituto ya que no es un sustituto de otra columna.
Tulains Córdova
fuente
¿Por qué se debe mostrar el PK? Creo que esa es mi pregunta: si una PK generada automáticamente se denomina clave sustituta es tangencial.
psr
1
@psr El título de su pregunta dice " las claves sustitutas se expondrán alguna vez". Dije que no. Pero tienes que mostrar alguna otra clave. Si no existe otra clave, debe mostrar la única clave que tiene. Tangencialmente aclaro que en esos casos la clave no es realmente un sustituto porque no es un sustituto de ninguna otra columna.
Tulains Córdova
La pregunta es si debe agregar una columna o mostrar la clave que tiene.
psr
@psr Reescribí mi respuesta para hacerlo más claro.
Tulains Córdova
1
Me parece una distinción materialmente insignificante. Si su regla es que cada tabla tiene una clave artificial (que es la mía), y que solo las claves artificiales participan en las uniones (que también es mi principio), entonces la noción de que una clave es un sustituto porque posiblemente otras claves podrían ser disponible es intrascendente.
Robert Harvey
0

SÓLO debe exponer un campo a un usuario que le brinde información útil, ya sea directamente o al informarle defectos.

por el contrario, SIEMPRE debe exponer las "claves primarias sustitutas" cuando son el medio principal para identificar un registro (simple o complejo) para una interacción que realiza el usuario.

DougM
fuente
0

No debería importar si expone las claves o no al usuario final. Su aplicación debe realizar la autorización necesaria de tal manera que simplemente conocer una identificación de pedido, por ejemplo, no puede permitirles acceder a algo a lo que normalmente no tendrían acceso.

advertencia: esto supone una aplicación basada en web o de n niveles donde la autorización del lado del servidor es posible / factible. Si tiene una aplicación VB que está ejecutando directamente SQL, ese es un problema completamente diferente.

Gran maestro B
fuente
¿Qué pasa con no poder insertar y luego eliminar registros, al tiempo que se conservan las relaciones de claves externas, como se menciona en la pregunta?
psr
¿Qué tiene que ver eso con exponer la clave al usuario? Tal vez no entiendo su uso del término 'exponer'. Estoy trabajando desde el supuesto de que te refieres a "poder ser visto por el usuario".
GrandmasterB