Estoy trabajando en el diseño de una base de datos que será utilizado para almacenar los datos que se origina a partir de un número de diferentes fuentes. Las instancias estoy almacenamiento se asignan Identificadores únicos por las fuentes originales. Cada instancia I de la tienda debe contener información acerca de la fuente de la que proviene, junto con el ID de asociado por esta fuente.

Como un ejemplo, considere la siguiente tabla que ilustra el problema:

----------------------------------------------------------------
| source_id | id_on_source | data                              |
----------------------------------------------------------------
| 1         | 17600        | ...                               |
| 1         | 17601        | ...                               |
| 2         | 1            | ...                               |
| 3         | 1            | ...                               |
----------------------------------------------------------------

Tenga en cuenta que mientras que el id_on_source es único para cada fuente, es posible que el mismo id_on_source ser encontrados por diferentes fuentes.

Tengo una decente comprensión de las bases de datos relacionales, pero estoy lejos de ser un experto o incluso un usuario experimentado. El problema al que me enfrento con este diseño es lo que yo debería utilizar como clave primaria. Los datos parecen dictar el uso de una clave principal compuesta de (source_id, id_on_source). Después de un poco de google me encontré con algunos debates acalorados sobre los pros y los contras de las claves primarias compuestas sin embargo, me dejó un poco confundido.

La tabla se tiene de uno a muchos relación con otras tablas, y por lo tanto se refiere en las claves externas de otras tablas.

No estoy atado a un determinado RDBMS y no estoy seguro de si es importante para el bien del argumento, pero digamos que prefiero trabajar con SQLite y MySQL.

¿Cuáles son los pros y los contras de la utilización de un compuesto de clave externa en este caso? Qué prefiere?

InformationsquelleAutor TC. | 2009-09-05

8 Comentarios

  1. 30

    Personalmente considero claves primarias compuestas a ser doloroso. Para cada tabla que desea unirse a sus «fuentes» de la tabla deberá añadir tanto los source_id y id_on_source campo.

    Me gustaría crear un estándar de incremento automático de la clave principal en su tabla de orígenes y agregar un índice único en source_id y id_on_source columnas.

    Esto permite que usted agregue simplemente el identificador de la tabla de orígenes como una clave externa en otras tablas.

    Generalmente también he encontrado el apoyo de claves primarias compuestas dentro de los muchos marcos de herramientas y productos a ser «parches» en el mejor de los e inexistente en otros

    • Pensar acerca de un compuesto de PK a de la tienda y la marca de tiempo de la Era (1, 1970~2106) (2, 2106~2242). Porque INT8, INT16, INT32, INT64 son binarios y basados en bits basado en el tamaño, a continuación, que no tienen una adecuada INT tamaño para el año 9999. INT no es suficiente y BIG INT es demasiado grande.
  2. 13

    Claves compuestas son difíciles de administrar y lento para unirse. Puesto que usted está construyendo una tabla de resumen, el uso de un sustituto de la clave (es decir,-un incremento automático/columna de identidad). Deje su natural columnas de clave de allí.

    Esto tiene un montón de otros beneficios, también. Sobre todo, si se mezcla con una empresa y tienen una de las mismas fuentes, pero reutilizados claves, vas a tener problemas si no el uso de una clave suplente.

    Este es el ampliamente reconocido mejores prácticas en el almacenamiento de datos (de un modo mucho más grande empresa de lo que estás haciendo, pero todavía es relevante), y por una buena razón. Los sustitutos de proporcionar la integridad de los datos y rápidas combinaciones. Usted puede quemarse rápidamente con claves naturales, por lo que mantenerse alejado de ellos como un identificador, y sólo los utilizan en el proceso de importación.

    • Qué problemas estás hablando exactamente? Si tienes conflictos en una mezcla, no, usted probablemente querrá un error, en lugar de duplicar los datos?
    • Exactamente, Sustituto teclas de invitar a la redundancia AFAIK.
    • Puede usted explicar por qué claves compuestas son lentos para unirse? Estoy tratando de entender por qué yo no usaría claves compuestas en realidad. Si tengo una tabla que hace referencia a otro con una clave compuesta (a,B), yo en realidad no tiene que unirse a través de todo el pk. Yo también podría escribir ` EN (a.A = otro.A)», derecho? Entonces, ¿qué hace que este más lento?
    • Claves compuestas debe ser no más lento para unirse de una Clave Suplente, siempre que la CK es correctamente indexado dado PK Índices índice de todos sus campos me parece que Eric reclamo difícil de creer – me gustaría ver perfilado consultas y puntos de referencia que demostrar cuantitativamente CKs son más lentos que los SKs.
    • Gracias por la aclaración. Yo no soy muy profundos en los sistemas de base de datos, pero no me hubiera imaginado que CKs son lentos para unirse – ¿por qué lo harían si ellos, como usted dijo, están correctamente indexados. No estoy tan seguro de si ellos son tan difíciles de manejar. Yo puede poner feo si usted tiene muy profundo de las dependencias donde en cada capa se debe heredar el CK de la tabla dependiente, pero no tengo este problema.
  3. 8

    Usted tiene un requisito de negocio que la combinación de esos dos atributos que son únicos. Así que, usted debe tener un UNIQUE restricción en esos dos atributos. Ya sea que usted llame que UNIQUE restricción «primary» en realidad es sólo una preferencia, no tiene mucho impacto, aparte de la documentación.

    La única pregunta es si usted, a continuación, agregar una columna adicional y se marca UNIQUE. La única razón por la que puedo ver que hacer que es el rendimiento, que es una razón legítima.

    Personalmente, no me gusta el enfoque de la transformación de cada base de datos esencialmente en una gráfica, donde el generado por las columnas son esencialmente los punteros y se acaba de atravesar de una a la siguiente. Creo que tira a la basura todos los de la grandeza de un sistema relacional. Si das un paso atrás y reflexionar sobre ella, está introduciendo un montón de columnas que no tienen sentido para su negocio, en todo. Usted puede estar interesado en mi relacionados con el blog.

  4. 6

    Creo que las claves compuestas crear un aspecto muy natural y descriptivo del modelo de datos. Mi experiencia viene de Oracle y no creo que hay problemas técnicos a la hora de crear un compuesto PK. De hecho a nadie el análisis de los datos de diccionario de inmediato entender algo sobre la mesa. En su caso sería evidente que cada source_id debe tener únicos id_on_source.

    El uso de claves naturales a menudo se crea un acalorado debate, pero la gente que trabajo con como natural claves de un buen modelo de datos de perspectiva.

    • sí, pero a unirse de un niño de mesa para una clave principal tiende a ser desordenado, si usted tiene que unirse en dos, tres, cuatro condiciones – y se hincha la clave principal y por lo tanto todos sus índices. Podría parecer natural, pero en realidad, no es una buena idea
    • uno de los puntos. Generalmente, usted encontrará que las entidades primarias se han DB generado clave única. por ejemplo, la tabla de Clientes con el CustomerId. Su general, secundaria tablas relacionadas que han compuesto las teclas y la mayoría de ellos no tiene FK hacer referencia a ellas. por ejemplo, si usted almacena el historial de clientes, números de teléfono, a continuación, en un Customer_contact_history tabla las columnas CustomerId, teléfono, changedate puede estar compuesto PK como estas 3 cosas son naturalmente único.
    • Yo voy a dar un voto porque estoy de acuerdo en principio. Pero no creo que sea la mejor solución en este ejemplo en particular!
  5. 3

    Prácticamente el único momento en que el uso de una clave principal compuesta es cuando la alta orden de parte de la clave es la clave de otra tabla. Por ejemplo, podría crear un OrderLineItem tabla con una clave principal de Idpedido + LineNumber. Como muchos de los accesos en contra de la OrderLineItem mesa será «el fin de unirse a orderlineitem utilizando (idpedido)» o alguna variación de que, esto es a menudo útil. También hace más fácil cuando se busca en la base de datos volcados para averiguar qué elementos de línea están conectados a qué orden.

    Como otros han señalado, claves compuestas son un dolor en la mayoría de las otras circunstancias, debido a que sus combinaciones tienen que participar todas las piezas. Es más bien del tipo que significa más potencial para los errores, las consultas son más lentos, etc.

    De dos partes claves no son malas; yo hago esos bastante a menudo. Soy reacio a utilizar una de tres partes clave. Más de las tres partes, yo diría que la olvide.

    En tu ejemplo, sospecho que hay poco para ser adquirida mediante el uso de la clave compuesta. Acabamos de inventar un nuevo número de secuencia y vamos a la fuente y de la fuente clave de ordinario atributos.

  6. 2

    Me encontré con problemas de uso de un montón de claves compuestas y así yo no lo recomiendo (más abajo), también he encontrado que hay beneficios en independiente/clave suplente (en vez de natural) cuando tratando de deshacer errores del usuario.
    El problema era que a través de un conjunto de relaciones, una tabla se unieron dos tablas donde para cada fila de la parte de la composición era la misma (esto era apropiado en la 3ª forma normal – una comparación entre dos partes de un padre). Yo de duplicados que parte de la composición de la relación en la tabla de combinación (así que en lugar de parent1ID, other1ID, parent2ID, other2ID había parentID, other1ID, other2ID), pero ahora la relación no podía actualizar los cambios en la clave principal, ya que trató de hacerlo dos veces a través de cada ruta y no en el medio.

  7. 1

    Algunos recomiendan el uso de un IDENTIFICADOR Único Global (GUID): la replicación de mezcla y la replicación transaccional con la actualización de suscripciones de uso uniqueidentifier columnas para garantizar que las filas se identifican a través de múltiples copias de la tabla. Si el valor si la única global cuando es creado, entonces usted no necesita agregar el source_id la hacen única.


    Aunque un uniqueid es una buena clave principal, estoy de acuerdo en que por lo general es mejor utilizar una diferente, natural (no necesariamente único) clave como el índice agrupado. Por ejemplo, si un uniqueid es el PK que identifica a los empleados, puede que desee índice agrupado a ser el departamento (si las instrucciones select generalmente recuperar todos los empleados dentro de un determinado departamento). Si usted desea utilizar un unqiqueid como el índice clúster, consulte la NEWSEQUENTIALID() función: crea secuencial uniqueid valores, que (ser secuencial) tienen una mejor agrupación de rendimiento.

    • sólo tenga cuidado (en SQL Server) NO para realizar su GUID clave principal la clave clúster de la tabla (que es, por defecto) – ver Kim Tripp excelente artículo sobre por qué no: sqlskills.com/BLOGS/KIMBERLY/post/…
    • añadido a mi respuesta a la dirección de ese comentario
    • Con respecto a la GUID: Si el requisito es sólo para tener un identificador único para cada registro, sí, esto va a funcionar. Pero si usted necesita saber cuál es la fuente fue, entonces usted tiene que publicar la identificación de la fuente en el registro de todos modos, usted tiene que tener una tabla de búsqueda en algún otro lugar (puaj), o usted tiene que buscar en todas las fuentes posibles, buscando que GUID (doble puaj). Si usted tiene que mantener la identificación de la fuente de todas formas, un GUID no agrega valor.
    • … ningún valor, excepto que usted no necesita una clave principal compuesta (la identificación de la fuente no necesita ser parte de la clave primaria).
  8. 1

    Añadiendo un extra de ID de columna dejará de tener que cumplir DOS singularidad restricciones en lugar de uno.

    Utilizando el extra de columna ID como clave externa en otros hace referencia a las tablas, en lugar de la clave que se presenta de forma natural, hará que usted tiene que hacer MÁS combinaciones, es decir, en todos los casos donde se necesita el original soruce_ID más ID_on_source junto con los datos de la tabla de referencia.

    • Qué necesitas para hacer cumplir la singularidad de esta aplicación? Si usted está recibiendo los datos de estos otros sistemas, presumiblemente es su problema para exigir la unicidad. Se vuelve a lo que usted necesita para llevar a cabo.
    • En cuanto a la extra unirse: me quedaría con la fuente y id_on_source en la misma tabla, si se trata de la clave principal o no. No veo ninguna razón para tener una segunda tabla para hacer traducciones. Mantener todo junto.

Dejar respuesta

Please enter your comment!
Please enter your name here