¿Por qué son claves compuestas desalentado en hibernación?

Esto es de Hibernate tutorial oficial:

Hay una alternativa <composite-id> declaración que permite el acceso al legado de datos con claves compuestas. Se recomienda su uso para otra cosa.

¿Por qué son claves compuestas desanimado? Estoy considerando la posibilidad de usar un 3-columna de la tabla donde todas las columnas son las claves externas y juntos formar una clave primaria que es una relación significativa en mi modelo. No veo por qué esto es una mala idea, espicially que voy a estar usando un índice en ellos.

¿Cuál es la alternativa? Crear un adicional generado automáticamente la columna y lo utilizan como una clave principal? Todavía necesito a mi consulta 3 columnas de todos modos!?

En resumen, ¿por qué es esta afirmación verdadera? ¿y cuál es la mejor alternativa?

  • Debe definir un sustituto de la clave principal y, a continuación, redefinir los existentes compuesto como un ser único (natural o de negocios) de la clave. Esto lleva a un lugar más limpio, más fácil de mantener la base de datos de diseño.
InformationsquelleAutor Isaac | 2013-01-01

5 Kommentare

  1. 43

    Desalientan a ellos por varias razones:

    • son engorrosas. Cada vez que usted necesita para hacer referencia a un objeto (o fila), para eexample en la aplicación web, se debe pasar de 3 parámetros en lugar de sólo uno.
    • son ineficientes. En lugar de simplemente hash de un entero, la base de datos de necesidades de hash de un compuesto de 3 columnas.
    • que conducir a errores: los desarrolladores inevitablemente implementar el equals y hashCode métodos de la clave principal de la clase de forma incorrecta. O es mutable, y modificar su valor una vez almacenados en un HashSet o HashMap
    • que contaminan el esquema. Si otra tabla que se necesita para hacer referencia a este 3 de la columna de la tabla, deberá tener 3 columnas, en lugar de simplemente como una clave externa. Ahora supongamos que usted siga con el mismo diseño y hacer de este 3 de la columna de clave externa de la parte de la clave primaria de esta tabla nueva, vas a tener una rápida 4-columna de clave principal y, a continuación, un 5-columna PK en la siguiente tabla, etc. etc., que conduce a la duplicación de datos, y un sucio esquema.

    La alternativa es tener una sola columna, auto-generada la clave principal, además de las otras tres columnas. Si usted desea hacer la tupla de tres columnas único, a continuación, utilizar una restricción unique.

    • Pero en el uso que usted tiene que tener los 3 parámetros para obtener el único dbs también se utilizan a menudo btrees no hashes para acceder a la clave no cuesta menos y tener un identificador único es una sobrecarga. Hay un debate sin resolver en el diseño de entre aquellos que prefieren id generados y los que quieren teclas físicas que conduce a las claves compuestas.
    • Un índice en una sola columna numérica es más rápido y requiere menos espacio que un índice de 3 columnas. Y ese es el índice que será el más utilizado en la aplicación. Ver también el punto adicional que he añadido a mi respuesta. He visto a gente usar esos tipos de compuestos PKs, y que conduce a las tablas con un 9-columna de clave principal de ser sólo una referencia a otra tabla, y 1 o 2 funcional de las columnas. Era horrible.
    • Yo iba a +1 a esto, pero luego se agregó la última viñeta y ahora quiero +10. Cualquier persona que se enfrenta a la terrible problema de la «cascada claves compuestas’ comenzará realmente a apreciar a simple sustituto claves como una parte esencial del diseño de base de datos.
    • Lo que trata de simples muchos-a-muchos vincular tablas? Ellos no tienen la mayoría de estos problemas y la manera obvia de hacer de ellos en el nivel de DB es tener una clave principal compuesta de todos los campos.
    • Hibernate utiliza un compuesto clave en este caso. Bu que no se hace referencia a cualquier otra tabla, y están limitados a dos columnas. Si se asigna como una entidad (y por lo tanto tienen dos ManyToOne asociaciones), me gustaría añadir una clave suplente a la mesa.
    • Creo que la viñeta 4 es el más importante de todos :), y -solo – es suficiente para marcar claves naturales en desuso.
    • la mayoría de los frameworks ORM automáticamente el enlace del mapa de tablas, aka no hay física entidades creadas para que los represente.
    • Si se enfrentan a cualquiera de las razones anteriores, entonces usted necesita para reconsiderar su diseño. Otra cosa, has tomado una BUENA decisión a través de una clave compuesta. Acerca de la limitación con Hibernate, echa un vistazo a mwsiri la respuesta.
    • Probablemente me estoy perdiendo algo muy básico, pero supongo que el uso de auto-generada la clave primaria de una entidad que en el sentido de los negocios es identificado por su nombre de la cadena, ¿cómo voy a encontrar a la entidad de DB usando su nombre? el uso de un «DONDE» la cláusula de la instrucción SELECT como no voy a saber su id en la capa de aplicación?
    • usted va a ejecutar una consulta: select u from User u where u.name = :name

  2. 39

    Incluso si es que – tal vez – es demasiado tarde para responder a su pregunta, quiero que aquí a dar otro punto de vista (más moderada espero) sobre la necesidad (Es realmente un aconsejar ?) de Hibernate para el uso de claves de suplente.

    Primero de todos, quiero ser claro en el hecho de que tanto claves de suplente (artificial auto-generadas) y claves naturales (compuesto de la columna(s) con dominio de significado) pros y contras. No estoy tratando de decir que una de las claves de tipo es mejor que el otro. Yo estoy tratando de decir que en función de sus requisitos, claves naturales podría ser una mejor opción que el sustituto y viceversa.

    Mitos sobre las claves naturales

    1. Claves compuestas son menos eficientes que las claves de suplente. No! Depende, en el motor de base de datos:
    2. Claves naturales no existen en la vida real. Lo siento pero existen! En la industria de la aviación, por ejemplo, la siguiente tupla siempre será único con respecto a un determinado programada de vuelo (de línea aérea, departureDate, flightNumber, operationalSuffix). De manera más general, cuando un conjunto de datos de negocio va a ser única por un determinado estándar luego de este conjunto de datos es un [buen] natural de la clave candidata.
    3. Claves naturales «contaminar el esquema» de niño tablas. Para mí esto es más un sentimiento que un problema real. Tener 4 columnas de clave principal de 2 bytes cada uno de ellos puede ser más eficiente que una sola columna, de 11 bytes. Además, el 4 columnas puede ser utilizada para la consulta de la tabla secundaria directamente (mediante el uso de las 4 columnas en una cláusula where), sin unirse a la tabla principal.

    Desventajas de las claves suplentes

    Sustituto claves son:

    1. Origen de los problemas de rendimiento:
      • Que suelen llevarse a cabo mediante incremento automático de columnas que significa que:
        • Una vuelta a la base de datos cada vez que desee obtener un nuevo Id (yo sé que esto puede ser mejorado mediante el almacenamiento en caché o [seq]hilo por igual algoritmos, pero todavía esos métodos tienen sus propios inconvenientes).
        • Si un día usted necesita para mover los datos de un esquema a otro (Esto ocurre con bastante regularidad en mi empresa de por lo menos), a continuación, usted podría encontrar el Id de la colisión de problemas. Y Sí, yo sé que usted puede usar Uuid, pero aquellos dura requiere de 32 dígitos hexadecimales! (Si usted se preocupa por el tamaño de la base, entonces puede ser un problema).
        • Si usted está utilizando una secuencia para todas sus claves de suplente, a continuación, – seguro – usted va a terminar con la contención en la base de datos.
    2. Propenso a Error. Una secuencia tiene un max_value límite así como un desarrollador tiene que poner atención a los siguientes hechos:
      • Debe su ciclo de secuencia ( cuando el máximo valor se alcanza se remonta a 1,2,…).
      • Si usted está utilizando la secuencia de un orden (en el tiempo) de sus datos, a continuación, usted debe tratar el caso de la bicicleta (columna con el Id 1 podría ser más reciente que el de la fila con Id max-valor – 1).
      • Asegúrese de que su código (e, incluso, sus interfaces de cliente que no debería ocurrir ya que supone una Identificación interna) apoya 32b/64b enteros que se utiliza para almacenar los valores de la secuencia.
    3. Que no es garantía de no duplicar los datos. Usted siempre puede tener 2 filas con los mismos valores de la columna pero con un diferente valor generado. Para mí este es LA problema de sustituto claves de un diseño de base de datos punto de vista.
    4. Más en Wikipedia…

    Por qué Hibernate prefiere/necesidades claves de suplente ?

    Como se indica en de Persistencia Java con Hibernate referencia:

    Más experimentado de Hibernación a los usuarios utilizar saveOrUpdate() exclusivamente; es
    mucho más fácil dejar de Hibernación decidir qué es lo nuevo y lo viejo,
    especialmente en una red más compleja de objetos con estado mixto. El
    sólo (no muy grave) la desventaja de exclusiva saveOrUpdate() es
    que a veces no puede adivinar si una instancia es viejo o nuevo
    sin disparar un SELECT en la base de datos—por ejemplo, cuando una clase es
    asignados con un natural compuesto clave y no hay ninguna versión o fecha y hora
    propiedad.

    Algunas manifestaciones de la limitación (así es como, creo, deberíamos llamarlo) se puede encontrar aquí.

    Conclusión

    Por favor, no seas tan cuadrado en sus opiniones. El uso natural de las teclas cuando es pertinente para hacerlo y el uso de claves de suplente cuando es mejor utilizarlas.

    La esperanza de que esto ayudó a alguien!

    • Me encanta el uso de claves compuestas cuando es apropiado, en voz alta y con orgullo! Se hace mucho más limpio diseño. Cuando es el lugar apropiado, usted no se enfrentan a ninguna de las desventajas que se le.
    • Una declaración importante dentro de ur respuesta es, More generally, when a set of business data is guaranteed to be unique by a given standard then this set of data is a [good] natural key candidate. a Menudo, no es la técnica la gente que en última instancia, hacer cumplir la norma. Generalmente, su no-el director técnico que los mandatos de una llave adicional se agrega a la pk, mientras que a caballo algunos de Steve Jobs como el poder de viaje/de la ilusión, en respuesta a una anomalía en el negocio. Ur propio ejemplo puede sugerir esto. ¿Por qué no una aerolínea, departureDate y flightNumber ser único? ¿Por qué es el sufijo incluso se necesita?
    • Respecto a «¿por Qué es el sufijo incluso se necesita?»; Es necesario para el caso específico, cuando un diario regular de vuelo se retrasa hasta el siguiente día (he.e originalmente programado para las 23:00, a continuación, reprogramada para el 00:30). Si utilizamos sólo el departureDate y la flighNumber entonces vamos a tener un duplicado de vuelo (el vuelo programado para el día n+1 y el que fue originalmente programada para el día n, pero se reprograma para el día n+1 debido a la demora). En el fin de mantener el mismo flightNumber así que evitar confusión a los clientes, nos acaba de añadir un sufijo (he.e ‘D’, por ejemplo).
    • Es cierto que a veces – por desgracia – la gente no técnica termina el establecimiento de estándares para la gente técnica. Sin embargo, creo que las normas deben ser puestos en forma conjunta por técnicos y funcionales de las personas. El sufijo ejemplo es una buena demostración de que algunos no-consideraciones técnicas (la gente se pierde por el cambio de su vuelo número) ha de tenerse en cuenta a la hora de definir un estándar. Por otra parte, cuando una norma es ya ampliamente adoptado que ya no importa si se trata de una «buena» o «mala» estándar.
    • Limpio consejo: «por Favor, no seas tan cuadrado en sus opiniones. El uso natural de las teclas cuando es pertinente para hacerlo y el uso de claves de suplente cuando es mejor usar el de ellos.»
    • Este debate es fuera de tema, en mi opinión. Como se indicó ambos sustituto natural y las teclas tienen pros y contras, pero en realidad estamos discutiendo esto en Hibernate / JPA punto de vista. Realmente es más fácil pasar un largo o int valor a un método llamado getmodel() en lugar de llamado getmodel(MySuperComplicatedPK pk). También un montón de código y muchas de las operaciones son manejadas por los marcos (hibernate y / o primavera) y es realmente más fácil para aquellos herramientas para trabajar siempre con «predictible» las claves principales en lugar de clases complicadas que cambiar de un dominio a antoher
    • «Además, el 4 columnas puede ser utilizada para la consulta de la tabla secundaria directamente» Que suena como un poco desagradable la duplicación de datos
    • ¿Cuál es la diferencia entre la duplicación de números (para extranjeros de la clave de referencia) y otros tipos de datos ?

  3. 10

    Me gustaría considerar el problema desde un punto de vista del diseño. No sólo en el caso de Hibernate considera bueno o malo. La verdadera pregunta es: son claves naturales buenos candidatos a ser buena identificadores de mis datos?

    En su modelo de negocio, que hoy puede ser conveniente para identificar un registro por algunos de sus datos, pero los modelos de negocio evoluciona en el tiempo. Y cuando esto sucede, usted encontrará que su clave natural no ajustan más a identificar sus datos. Y con la integridad referencial en otras tablas, esto hará que las cosas MUCHO más difícil el cambio.

    Tener un sustituto PK es conveniente ya que no se de la cadena de cómo los datos se identifica en su almacenamiento con su modelo de negocio estructura de.

    Claves naturales no pueden ser generados a partir de una secuencia, y en el caso de los datos que no pueden ser identificados por sus datos se mucho más frecuentes. Esta es una evidencia de que las claves naturales difieren de una clave de almacenamiento, y que no puede ser tomado como un general (y buena) enfoque.

    El uso de claves de suplente simplifica el diseño de la aplicación y la base de datos. Son más fáciles de usar, son más eficientes y hacer un trabajo perfecto.

    Claves naturales sólo traen desventajas: no puedo pensar en una sola ventaja para el uso de claves naturales.

    Que dijo, creo que hibernate no tiene verdaderos problemas con natural (compuesto) teclas. Pero usted probablemente encontrará algunos problemas (o bugs) a veces, y los problemas con la documentación, o tratando de conseguir ayuda, ya que la hibernación de la comunidad reconoce los beneficios de las claves suplentes. Así, preparar una buena respuesta para ¿por qué te hizo elegir una clave compuesta.

    • +1, también hay algo que decir para los identificadores que están bajo el control de los desarrolladores de las aplicaciones en lugar de estar atado a la empresa o controlada por una entidad externa (como los números de seguro social o abas).
  4. 1

    Si la documentación de Hibernate, bien entendida:

    «No es una alternativa <composite-id> declaración que Permite el acceso al legado de datos con claves compuestas. Se recomienda su uso para cualquier otra cosa.»

    sobre el tema 5.1.4. id de la etiqueta xml <id> que permite la clave principal de asignación de hecho demasiado pronto podemos concluir que la documentación de hibernate no aconseja el uso de <composite-id> en lugar de <id> etiqueta xml para la clave principal compuesta de asignación y NO se hace ninguna referencia a la negativa para el uso de claves primarias compuestas.

    • Ya hay una respuesta a la pregunta, si usted tiene alguna idea sobre cómo mejorar.. amabilidad de publicar su suggestion a la respuesta que elijas también para ayudar y actualización de la misma.
    • Mi intención es negar la cita a la que la documentación de hibernate no recomendamos el uso de una clave principal compuesta y llevar la discusión a un personaje que no se basa en la errónea comillas, porque quien se opone a una opinión de la documentación? Yo no estoy en contra de la utilización de la clave primaria compuesta, pero estoy en contra de las partes malas citas entendido
  5. 0

    Las aplicaciones desarrolladas con la base de datos como una herramienta definitivamente son más beneficiosos para mantener el flujo de trabajo en claves de suplente, el uso de índices agrupados para la optimización de consultas.

    Especial cuidado necesita ser hecho para el Almacenamiento de Datos y OLAP estilo de los sistemas, sin embargo, que utilizan una enorme Tabla de Hechos para atar las claves suplentes de dimensiones juntos. En este caso los datos dicta el panel de control/aplicación que puede ser utilizado para mantener los registros.

    Así que en lugar de un método es preferible a otra, quizás se trate de una directiva es ventajoso para el otro, para la construcción clave : puede no ser el desarrollo de una Hibernación de la aplicación muy fácil de aprovechar el acceso directo a una de SSAS instancia del sistema.

    Puedo desarrollar el uso de claves de mezclas, y sentir a implementar un sólido en forma de estrella o copo de nieve patrón sustituto con un índice agrupado es típicamente mi primera opción.

    A los que se refiere el OP y otros que miran por: si usted desea permanecer db invariante con su desarrollo (que Hibernate se especializa en) — utilizar el sustituto método, y que, cuando se lee la tendencia a disminuir, o aviso de determinadas consultas de drenaje de rendimiento, volver a su base de datos específica, y agregar compuesto, agrupado los índices que optimizar la consulta de la orden.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea