2010-11-27 33 views
10

Encontré este material de lectura en choosing a primary key.¿Cómo elegir mi clave principal?

  • ¿Hay una publicación de guía/blog sobre cómo elegir la clave principal para una tabla determinada?
  • ¿Debo usar una clave autoincrementada/generada, o debería basar la clave principal en los datos que se modelan (suponiendo que tenga un campo realmente único)?
  • ¿Debería la clave principal ser siempre larga para el rendimiento, o puedo tomar una identificación única externa como clave principal, incluso si es una cadena?

Respuesta

10

Creo que en la práctica el uso de un natural key rara vez es mejor que un surrogate key.

Las siguientes son las principales desventajas de utilizar una clave natural como la clave principal:

  • Es posible que tenga un valor de clave incorrecta, o puede que simplemente quieren cambiar el nombre de un valor clave. Para editarlo, debería actualizar todas las tablas que lo usarían como clave externa.

  • A menudo es difícil tener una verdadera clave natural unique.

  • Las claves naturales a menudo son cadenas. Un índice en un campo numérico será mucho más compacto que uno en un campo de cadena.

No existe una regla rígida sobre cuál debe ser el tipo de datos de la clave principal. Una clave numérica normalmente funciona mejor, pero puede usar una cadena, especialmente si la tabla no es grande, y las tablas que hacen referencia a ella tampoco son grandes.

+0

+1 - No he tenido ningún infierno por la combinación del uso de claves naturales en DB y el personal administrativo insistiendo en reutilizar las ID de cliente porque no quieren joeblogs13 si solo hay 12 blogs Joe activos ... a pesar de está haciendo mal todos los informes posibles y nos deja con las condiciones de carrera en cada página de nuestro sitio web ... – tobyodavies

+0

@Daniel Vassallo: ¿Prefiere usar una clave sustituta que un código VIN para vehículos o códigos ISBN para libros como clave principal? Esos códigos son cumplidores ISO, ¿no crees que si uno está lidiando con problemas de la industria, esos tendrán un mejor efecto que la clave sustituta? – Spredzy

+1

@Spredzy: en la mayoría de los casos sí. El primer punto que mencioné podría ser muy problemático. Las claves principales no están destinadas a ser cambiadas, y usted fácilmente podría tener un error tipográfico en un ISBN que desea modificar ... A menudo hay otras complicaciones con las claves naturales, como (citando [de Wikipedia] (http://en.wikipedia.org/wiki/International_Standard_Book_Number)): "Ocasionalmente, un libro puede aparecer sin un ISBN impreso si se imprime de forma privada o si el autor no sigue el procedimiento habitual de ISBN, sin embargo, esto generalmente se rectifica posteriormente" ... Estas excepciones son difíciles de tratar ... –

-4

Siempre elijo uuid como clave principal. En comparación con la clave int/long, hay una ligera sobrecarga, pero hay muchos beneficios: no se puede ejecutar el desbordamiento de tipos, puede fragmentar la base de datos más tarde sin cambiar las claves principales, puede integrarse con otros sistemas y asegurarse de que sus claves primarias son siempre únicos, UUID no se puede adivinar etc.

+0

-1 lo siento por el voto a favor, pero "siempre elige un uuid" vs. "usa un uuid cuando sea apropiado" 4 bytes vs 36 - hmmm, llena esos buffers !! –

0

he trabajado con un montón de diferentes modelos de datos en sistemas profesionales (principalmente software bancario) y e fueron diferentes soluciones. Hubo una solución GUID que he visto y que parecía no haber afectado demasiado a las actuaciones. He visto el "número proporcionado por un servicio como un número único de todo el sistema". He visto algoritmos de proporcionar algo así como un GUID "pero más corto". También he visto que se usó la clave comercial (como el número de cuenta), que es un diseño deficiente y causó problemas, y no lo recomendaría. He visto la clave autoincrementada para cada tabla.

¿Qué es lo que más me gusta? El número proporcionado por un servicio como un número de sistema completo. Funciona bien. Y con una simple tabla de traducción de claves, puede usar una clave de usuario (como un número de cuenta) para averiguar qué número único y qué tipo de objeto de datos (no necesariamente la tabla porque la misma clave única puede aplicarse a varias tablas si un objeto de datos se divide en diferentes tablas dependiendo de su tipo).

Entonces, ¿hay algún blog o algo así? Bueno, tengo un libro para recomendar llamado "Data Modeling Essentials" por Graeme Simsion y Graham Witt. Puede que no sugieran mi solución preferida, pero dan muchos ejemplos reales y muestran los diferentes tipos de soluciones que son posibles.

1

utilizo sustitutas llaves, a menudo referido como sin sentido llaves, compuestos de un tipo de datos int autogenerado/bigint.

Estos son algunos de los motivos por los que me gusta usar estas teclas.

  • Al eliminar varios elementos de una lista (por ejemplo, edad, correo electrónico) se puede suministrar una lista separada por comas de los números enteros en lugar de guids o claves naturales
  • lo encuentro hace que escribir su propia cascada elimina más fácil
  • Creo que las combinaciones internas son más rápidas en los campos enteros
  • Puede facilitar el aprendizaje del nuevo sistema sin documentación.
1

Una clave es un conjunto de atributos con dos características fundamentales: unicidad y minimización. La minimización significa que la clave tiene solo la cantidad mínima de atributos necesarios para garantizar la singularidad.

Hay tres criterios comúnmente aplicados como una guía para la elección de una buena clave:

  • familiaridad - claves deben ser significativas y familiar para las personas que los utilizan
  • Simplicidad - llaves debe ser lo más simple y conciso posible
  • Estabilidad - valores clave deben cambiar con frecuencia

Estas son buenas directrices, pero no son requisitos absolutos. En todos los casos, los requisitos funcionales y las necesidades de integridad de los datos deberían determinar qué claves usar.

Cuestiones relacionadas