¿Qué debería considerar al seleccionar un tipo de datos para mi key principal?

Cuando estoy creando una nueva tabla de database, ¿qué factores debo tener en count para seleccionar el tipo de datos de la key principal?

Perdón por hacer eso, pero encontré que las respuestas que di a preguntas relacionadas (puedes verificar esto y esto ) podrían aplicarse a esta. Los networkingiseñé un poco …

Encontrará muchas publicaciones relacionadas con este tema, y ​​cada elección que haga tendrá sus pros y sus contras. Los arguments para estos generalmente se refieren a la teoría de bases de datos relacionales y al performance de la database.

Sobre este tema, mi punto es muy simple: las keys primarias sustitutas SIEMPRE funcionan , mientras que las teclas naturales NO SIEMPRE pueden funcionar uno de estos días , y esto por varias razones: campo demasiado corto, cambios de reglas, etc.

Hasta este punto, has adivinado que básicamente soy un miembro del equipo uniqueIdentifier / subrogado primary key, e incluso si aprecio y entiendo arguments como los presentados aquí, todavía estoy buscando el caso en el que "natural" la key es mejor que la sustituta …

Además de esto, uno de los arguments más importantes pero siempre olvidados a favor de esta regla básica está relacionado con la normalización y la productividad del código :

cada vez que creo una tabla, ¿perderé time?

  1. identificando su key primaria y sus características físicas (tipo, tamaño)
  2. recordando estas características cada vez que quiero referirme a él en mi código?
  3. explicando mi opción PK a otros desarrolladores en el equipo?

Mi respuesta es no a todas estas preguntas:

  1. No tengo time para perder el bash de identificar "la mejor key primaria natural" cuando la opción sustituta me brinda una solución a testing de balas.
  2. No quiero recordar que la key principal de mi Table_whatever es una cadena de 10 caracteres de longitud cuando escribo el código.
  3. No quiero perder el time negociando la longitud de la key natural: "bueno, si necesitas 10, ¿por qué no tomas 12 para estar seguro ?". Este argumento de "en el lado seguro" realmente me molesta: si quieres estar seguro, significa que realmente no estás lejos del lado inseguro. Elige un sustituto: ¡es a testing de balas!

Así que he estado trabajando durante los últimos cinco años con una regla muy básica: cada tabla (llamémosla 'myTable') tiene su primer campo llamado 'id_MyTable' que es de tipo uniqueIdentifier. Incluso si esta tabla admite una relación "muchos a muchos", donde una combinación de campos ofrece una key principal muy aceptable, prefiero crear este campo 'id_myManyToManyTable' como uniqueIdentifier, solo para cumplir con la regla y porque finalmente , No hace daño.

La principal ventaja es que ya no tiene que preocuparse por el uso de la key principal y / o la key externa en su código. Una vez que tenga el nombre de la tabla, conocerá el nombre y el tipo de PK. Una vez que sepa qué enlaces se implementan en su model de datos, sabrá el nombre de las keys externas disponibles en la tabla.

Y si aún desea tener su "Clave natural" en algún lugar de su tabla, le aconsejo que la cree siguiendo un model estándar tal como

 Tbl_whatever id_whatever, unique identifier, primary key code_whatever, whateverTypeYouWant(whateverLengthYouEstimateTheRightOne), indexed ..... 

Donde id_ es el prefijo para la key principal, y code_ se usa para el campo indexado "natural". Algunos argumentarían que el campo code_ debe establecerse como único. Esto es cierto y se puede administrar fácilmente a través de DDL o código externo. Tenga en count que muchas keys "naturales" se calculan (numbers de factura), por lo que ya se generan a través del código

No estoy seguro de que mi regla sea la mejor. ¡Pero es muy eficiente! ¡Si todos lo aplicaran, por ejemplo, evitaríamos perder time respondiendo a este tipo de preguntas!

Si usa una key numérica, asegúrese de que el tipo de datos giong sea lo suficientemente grande como para contener el número de filas que podría esperar que crezca la tabla.

Si usa un GUID, ¿se debe considerar el espacio adicional necesario para almacenar el GUID? La encoding de Guid PKs será un problema para los desarrolladores o usuarios de la aplicación.

Si usa keys compuestas, ¿está seguro de que las columnas combinadas siempre serán únicas?

Realmente no me gusta lo que enseñan en la escuela, es decir, usar una 'key natural' (por ejemplo, ISBN en una database de libros) o incluso tener una key principal compuesta de 2 o más campos. Nunca haria eso. Así que aquí está mi pequeño consejo:

  • Siempre tenga una columna dedicada en cada tabla para su key principal.
  • Todos deben tener el mismo nombre de colomn en todas las tablas, es decir, "ID" o "GUID"
  • Use GUID cuando pueda (si no necesita performance), de lo contrario, incrementando las INT

EDITAR:
De acuerdo, creo que necesito explicar mis elecciones un poco.

  • Tener un nombre de columna dedicado igual en toda la tabla para su key principal, simplemente hace que sus declaraciones SQL sean mucho más fáciles de build y más fáciles de entender para otra persona (que pueda no estar familiarizada con el layout de su database). Especialmente cuando haces muchas UNIDAS y cosas por el estilo. No necesita search cuál es la key primaria para una tabla específica, ya lo sabe, porque es igual en todas partes.

  • GUIDs vs. INTs realmente no importa tanto la mayoría del time. A less que scope el límite de performance de los GUID o fusiones de bases de datos, no tendrá problemas importantes con uno u otro. PERO hay una razón por la que prefiero los GUID. La singularidad global de los GUID siempre puede ser útil algún día. Tal vez no ve la necesidad ahora, pero cosas como sincronizar partes de la database con una computadora portátil / teléfono celular o incluso encontrar loggings de datos sin necesidad de saber en qué tabla se encuentran, son excelentes ejemplos de las ventajas que los GUID pueden ofrecer. proporcionar. Un integer solo identifica un logging dentro del context de una tabla, mientras que un GUID identifica un logging en todas partes.

En la mayoría de los casos, uso una key primaria identity int, a less que el escenario requiera mucha replicación, en cuyo caso puedo optar por un GUID.

Yo (casi) nunca usé llaves significativas.

A less que tenga una key natural ultra conveniente disponible, utilice siempre una key sintética (aludida) de tipo numérico. Incluso si tiene una key natural disponible, es posible que desee considerar el uso de una key sintética de todos modos y colocar un índice único adicional en su key natural. Considere lo que sucedió con las bases de datos de mayor jerarquía que usaban numbers de security social como PK cuando cambiaba la ley federal, los costos de cambiar a keys sintéticas eran enormes.

Además, tengo que estar en desacuerdo con la práctica de nombrar cada tecla principal de la misma manera, por ejemplo, "id". Esto hace que las consultas sean más difíciles de entender, no más fáciles. Las keys primarias deben nombrarse después de la tabla. Por ejemplo employee.employee_id, affiliate.affiliate_id, user.user_id, y así sucesivamente.

No utilice un tipo numérico de coma flotante, ya que los numbers de punto flotante no se pueden comparar correctamente para la igualdad.

  • ¿Dónde lo generas? Incrementar el número no encaja bien con las keys generadas por el cliente.
    • ¿Desea una key dependiente de datos o independiente (a veces puede usar una ID de datos comerciales, no puede decir si esto siempre es útil o no)?
    • ¿Qué tan bien puede este tipo ser indexado por su DB?

He utilizado uniqueidentifiers (GUID) o incrementos integers hasta el momento.

Saludos Matías

Los numbers que tienen un significado en el mundo real generalmente son una mala idea, porque de vez en cuando el mundo real cambia las reglas sobre cómo se usan esos numbers, en particular para permitir duplicates, y entonces usted tiene un verdadero lío en sus manos.

Me gusta usar una key entera generada. Si espera que la database crezca demasiado, puede ir con bigint.

A algunas personas les gusta usar guids. El profesional es que puede fusionar varias instancias de la database sin alterar ninguna key, pero la desventaja es que el performance puede verse afectado.

Para una key "natural", cualquiera que sea el tipo de datos que se adapte a la (s) columna (s). Las keys artificiales (sustitutas) suelen ser numbers integers.

Todo depende.

a) ¿Está bien tener numbers numéricos secuenciales únicos como key principal? Si es así, entonces seleccionar UniqueIdentifier como su key principal será suficiente. b) Si la demanda de su negocio es tal que necesita tener una key principal alfanumérica, entonces tiene que ir por varchar o nvarchar.

Estas son las dos opciones en las que podría pensar.

Un gran factor es la cantidad de datos que va a almacenar. Trabajo para una empresa de análisis web, y tenemos CARGAS de datos. Por lo tanto, una key principal de GUID en nuestra tabla de visitas a página nos mataría, debido al tamaño.

Una regla general: para un alto performance, debe poder almacenar todo su índice en la memory. ¡Las guías podrían romper esto fácilmente!

Normalmente siempre uso un número integer, pero aquí hay una perspectiva interesante.

http://www.codinghorror.com/blog/archives/000817.html

Use llaves naturales cuando se pueda confiar. Algunas fonts de keys naturales no se pueden confiar. Hace años, la Administración de Seguridad Social solía ocasionalmente arruinar y asignar el mismo SSN a dos personas diferentes. Probablemente ya hayan arreglado eso.

Probablemente pueda confiar en los VIN para vehículos y en los ISBN para libros (pero no para los panfletos, que pueden no tener un ISBN).

Si usa keys naturales, la key natural determinará el tipo de datos.

Si no puede confiar en ninguna key natural, cree una key sintética. Prefiero los integers para este propósito. Deje suficiente espacio para una expansión razonable.

Normalmente voy con una key primaria de columna GUID para todas las tablas (rowguid en mssql). Lo que podrían ser keys naturales, hago restricciones únicas. Un ejemplo típico sería un número de identificación de producto que el usuario debe deviseiar y asegurarse de que sea único. Si necesito una secuencia, como en una factura, creo una tabla para mantener un último número y un procedimiento almacenado para garantizar el acceso serializado. O una secuencia en Oracle 🙂 Odio la muestra del "número de la security social" para keys naturales ya que ese número nunca estará siempre disponible en un process de logging. Resultando en una necesidad de un esquema para generar numbers ficticios.

Siempre que sea posible, intente utilizar una key principal que sea una key natural. Por ejemplo, si tuviera una tabla donde registrara un logging todos los días, la date de inicio de session sería una buena key principal. De lo contrario, si no hay una key natural, simplemente use int. Si cree que usará más de 2 mil millones de filas, use un bigint. A algunas personas les gusta usar GUID, que funciona bien, ya que son únicas, y nunca se quedará sin espacio. Sin embargo, son innecesariamente largos y difíciles de escribir si solo está haciendo consultas ad hoc.