Estoy mirando los pros y los contras de estos tres métodos principales de las claves principales para la base de datos de las filas.

Así, suponiendo que yo estoy usando una base de datos que soporta más de uno de estos métodos, hay una simple heurística para determinar cuál es la mejor opción sería para mí?

Cómo hacer consideraciones de tipo distribuido/varios maestros, los requisitos de rendimiento, ORM, el uso, la seguridad y las pruebas que tienen en la elección?

Inesperados inconvenientes que uno podría tener?

  • ¿qué tipo de lenguaje / orm proveedor usas?
  • Java. Cualquiera de Hibernación o Eclipselink. Aunque realmente estoy buscando sobre todo para los más genéricos, puntos en cuanto a sus ventajas y desventajas.
  • El idioma o el método de acceso no debe tener ninguna influencia en la clave principal. La clave principal uniquly identificar el objeto, entidad, persona, ect. Si la clave principal es amplia, navrchar(25) para mí, a continuación, utilizar un número entero a sustituir como una columna de identidad. pensar acerca de los datos que serán almacenados y el modelo de almacenamiento de datos para proporcionar la mejor OLAP, velocidad de la transacción, o la presentación de informes de la velocidad que uno necesita.
  • Yo solía ser más de un «purista», incluso con un compuesto de PKs. Ahora puedo ver el PK como internos a la base de datos (por ejemplo, un auto-int secuencia está bien – GUID es excesivo para la mayoría de los casos), y de imponer los requisitos de relación como separados de los índices únicos; sin embargo, es sólo la «correcta PK» (lo que sería el PK si no se auto-columna) que creo que debería ser transmitida entre los sistemas, lo que resulta ser. Sin embargo, a diferencia de algunos, yo no ver esto como un «absoluto» de la regla y aceptar (en realidad, bastante disfrutar) las diferentes dinámicas en diferentes bases de datos. Yo también favorecen inmutable registros.
  • sí tiene algo que ver con eso… El debate sobre la identidad de los objetos en el ORM mundo es larga.
  • Creo que también hay algunos casos de uso cuando el uso de un ORM que podría resultar en ciertas ventajas/desventajas de las opciones dadas, pero puedo estar equivocado.

InformationsquelleAutor Tim | 2011-01-10

1 Comentario

  1. 31

    Uuid

    A menos que estos son generados «en el aumento de la monótona secuencia» se puede drásticamente herido/fragmento de índices. Apoyo para el UUID de generación varía según el sistema. Mientras utilizable, yo no usaría un UUID como mi primaria agrupado índice/PK en la mayoría de los casos. Si es necesario que yo haría es un secundario de la columna, tal vez indexados, tal vez no.

    Algunas personas argumentan que el Uuid se puede utilizar de forma segura de generar/combinar registros de un número arbitrario de los sistemas. Mientras que un UUID (dependiendo del método) generalmente tiene una astronómicamente pequeña probabilidad de colisión, es posible, al menos con algunos de fuera de la entrada o muy mala suerte 🙂 — generar colisiones. Yo soy de la creencia de que sólo un verdadero PK debe ser transmitida entre los sistemas, que yo diría que no es (o no debería ser) un de la base de datos generada UUID en la mayoría de los casos.

    autoincrement/teclas de secuencia y secuencia de tablas

    Esto realmente depende de lo que la base de datos admite bien. Algunas bases de datos de soporte de secuencias que son más flexibles que un simple «auto-increment». Esto puede o puede no ser deseable (o puede ser la única manera para este tipo de tarea simplemente, incluso). La secuencia de las mesas son generalmente más flexibles, pero si este tipo de «flexibilidad» es necesario que yo estaría tentado a volver y visitar el diseño-patrón, especialmente si implica el uso de los factores desencadenantes. Mientras no me gusta «, limitando Orm», que también puede hacer una diferencia en la elección de la «simple» auto-increment o de la secuencia de tipos de datos/base de datos de apoyo.

    Independientemente del método utilizado, cuando se utiliza sustituto de las claves principales, el verdadera clave principal todavía debe ser identificado y codificado en el esquema.

    Además, yo diría que los «compromisos de seguridad a través de la exposición de un auto-secuencia de PK» son el resultado de una incorrecta exposición de un interna propiedad de base de datos. Mientras una manera muy sencilla de manejar operación CRUD, creo que hay una distinción entre el claves internas y la expone las claves (por ejemplo, bastante número de cliente).

    Sólo mis dos centavos.

    Editar, adicionales respuestas a Tim:

    Creo que la generada vs true PK pregunta es muy buena y uno necesita considerar también. Me gustaría Uuid en general a los puntos que usted hace. Mi duda era en tamaño vs int/largo. No era consciente del potencial de la indexación de las optimizaciones, que es mucho más grande preocupación para mí.

    Que no te preocupes mucho por el tamaño-si un UUID es el mejor, entonces es mejor. Si es no, es no. En el esquema general el extra 12bytes más de un int probablemente no hará mucha diferencia. SQL Server 2005+ admite la newsequentialid UUID de la función de generación de evitar la fragmentación asocian con el UUID de la generación. La página se discute poco. Estoy seguro de que otras bases de datos tienen soluciones similares.

    Y por «codificado en el esquema», ¿quieres decir que más de la adición de una restricción de unicidad?

    Sí. La clave principal no tiene por que ser la única [único] restricción. Usando sólo un sustituto PK no significa que el modelo de base de datos debe estar comprometida 🙂 índices Adicionales también puede ser utilizada para cubrir, etc.

    Y por «la distinción entre», estás diciendo que sustituyen a las claves primarias nunca se fuga?

    La redacción de mi primer post fue un poco duro. No se trata de «nunca» tanto como «si lo hacen y asuntos entonces ese es otro problema». Muchas veces la gente se queja de la inseguridad a través de adivinar los números-por ejemplo, si su pedido es de 23 a continuación, es probable que un orden de 22 y 24, etc. Si este es su «protección» y/o fuga de información sensible, entonces el sistema ya es deficiente. (La separación de internos y externos ids no inherentemente solucionar este problema y autenticación/autorización sigue siendo necesario. Sin embargo, es una cuestión que se planteó en contra del uso de «secuencial id» — me parece que codifica un nonce distribuidas Url maneja este para mi de caso de uso bastante bien.)

    Más a lo que yo realmente quería conseguir a través de: Sólo porque el sustituto PK id pasa a ser 8942 no significa que es el fin de 8942. Que es, de acuerdo con el «algunos campos son sólo internos a db» de diseño, con el fin de «número» podría ser totalmente independientes en la superficie (pero totalmente compatible con el modelo DB), como «#2010-42c» o lo que tiene sentido para el requisito de negocio(s). Es esta externo número que debe ser expuesto en la mayoría de los casos.

    Yo siento que a veces la clave generada es la verdadera clave principal como el resto de campos son mutables (por ejemplo. el usuario puede cambiar dirección de correo electrónico y nombre de usuario).

    Este puede ser el caso dentro de una base de datos y no voy a discutir esta declaración. Sin embargo, una vez más, en la que sostiene que el sustituto PK son interna a la base de datos, sólo asegúrese de que sólo la exportación/importación de tuplas que puede ser bien identificado. Si el nombre de usuario/dirección de correo electrónico puede cambiar, entonces esto podría muy bien incluir un UUID asignadas en el momento de creación de la cuenta — y podría muy bien ser el sustituto PK sí mismo.

    Por supuesto, como con todo, sigue abierto y ajustar el modelo para el problema, no el problema para el modelo 🙂 Por un servicio como twitter, por ejemplo, utilizan su propio número de generación de esquema. Ver Twitter de la nueva generación del ID. A diferencia de [algunos] UUID generación, el enfoque por twitter (suponiendo que todos los servidores están correctamente el programa de instalación) garantías que ninguna de las máquinas distribuidas/procesos jamás va a generar un IDENTIFICADOR duplicado, sólo requiere de 64 bits, y mantiene áspero de los pedidos (bits más significativos son el sello de tiempo). (El número de registros generados por el twitter puede ser relacionada de ninguna manera con los requisitos locales 😉

    Feliz codificación.

    • Creo que la generada vs true PK pregunta es muy buena y uno necesita considerar también. Me gustaría Uuid en general a los puntos que usted hace. Mi duda era en tamaño vs int/largo. No era consciente del potencial de la indexación de las optimizaciones, que es mucho más grande preocupación para mí. Y por «codificado en el esquema», ¿quieres decir que más de la adición de una restricción de unicidad? Y por «la distinción entre», estás diciendo que sustituyen a las claves primarias nunca se fuga? Yo siento que a veces la clave generada es la verdadera clave principal como el resto de campos son mutables (por ejemplo. el usuario puede cambiar dirección de correo electrónico y nombre de usuario).
    • Cambios por usted. Disfrutar.
    • Más pensamientos en Uuid

Dejar respuesta

Please enter your comment!
Please enter your name here