¿Columnas de identidad o UDF que generan explícitamente una identificación única?


11

Estoy en medio de un debate sobre si es mejor hacer una PRIMARY KEYde una columnas de identidad , nuestra salida de una UDF que genera explícitamente un identificador único.

  • Estoy argumentando a favor de la columna de identidad.
  • Mi compañero argumenta a favor de generar los valores manualmente, afirma
    • poniendo el UDF en otra mesa donde podemos tener un UDF
      • bloquear el recurso
      • incrementar una tabla de ID con un campo llamado ID_Valuepor1
      • use esto como un identificador único global
    • O haga que la tabla haga un id+1al insertar
    • Que es más sencillo mover datos entre servidores y / o entornos que no tienen la restricción de identificación; pasar de una base de datos donde hay datos a otra base de datos similar con, digamos, etapas o datos ficticios. Para las pruebas que no son de producción, es posible que queramos extraer todos los registros de ayer para organizarlos para la prueba.

¿Qué implementación tiene más sentido?

Respuestas:


21

Tu colega es un idiota.

La solución no será escalable, el UDF no es concurrente ( mismo motivo que este ). ¿Y cómo maneja las inserciones de varias filas? Esto requeriría una llamada UDF por fila

Y la migración a otros RDBMS no ocurre a menudo en la vida real ... es mejor que no use SQL Server ahora y use secuencias en Oracle y espere no migrar.

Editar:

Su actualización indica que mover datos es para actualizar bases de datos que no son de producción.

En ese caso, ignora las columnas de identidad al actualizar. No compromete su implementación para facilitar la carga sin productos. O use tablas temporales para rastrear los cambios en el valor de identidad.

O utilice procesos: actualizamos nuestro sistema de prueba todas las noches desde la producción, lo que evita el problema por completo. (Y garantiza que nuestra copia de seguridad de productos también se pueda restaurar)


11

Utiliza un valor de identidad. Generar su propia tabla de secuencia y valores de secuencia requerirá una gran sobrecarga y causará muchos bloqueos y bloqueos al intentar generar números.

La identidad existe por una razón, úsala.

Cuando salga SQL Denali, admitirá secuencias que serán más eficientes que la identidad, pero usted no puede crear algo más eficiente.

En cuanto a mover registros de un entorno a otro, active IDENTITY_INSERT al hacer la inserción o marque la casilla en SSIS.


Si pasa de "producción" a "prueba" y tiene un campo de identidad, corre el riesgo de sobrescribir o colisionar sobre los datos. Eso es todo lo que digo. Sí, no debería ser un problema en esa dirección, pero solo digo que podría suceder.
jcolebrand

Es cierto que tendrá el mismo número para diferentes valores de fila en dev, test, qa, uat y production. ¿Y qué? Si esos valores son importantes (como para una tabla de búsqueda), codifíquelos manualmente, lo que no debería ser un problema, ya que no debería poner valores en esas tablas con mucha frecuencia. Si necesita controlar los valores de identidad entre los entornos para evitar colisiones, restablezca los valores de identidad entre los entornos cuando realice la restauración desde la producción.
mrdenny

5

La columna de identidad me suena bien. No estoy seguro de seguir la lógica de por qué es difícil mover datos entre servidores.

Si desea que cada fila tenga una identidad global única, puede usar un UUID, pero no lo haría a menos que esté seguro de que la unicidad global es necesaria, por lo general no lo es. El uso de UUID como identificadores disminuirá el rendimiento, aumentará los requisitos de espacio en disco y dificultará la depuración; debido a la longitud, es difícil recordar un UUID, decírselo a alguien por teléfono o anotarlo en papel sin error.


4

Para identificaciones numéricas simples, simplemente vaya con identidad y olvide todos los problemas de generarlas manualmente.

Siempre puede crear una "supertabla" que use una identidad como PK y tenga una columna de tipo, y cualquier otra información. Cuando necesite una nueva ID (suponiendo que se refiera a IDS únicas en diferentes tablas) simplemente inserte en esta tabla y tome la SCOPE_IDENTITY()y luego inserte en la tabla real que necesita.

Básicamente crea una tabla: MasterIDs con una identidad PK, cuando necesita insertar una fila en su Table1, INSERT INTO MasterIDsy obtiene la identidad generada por esa fila usando SCOPE_IDENTITY()y luego inserta en Table1 usando ese valor como PK.

Table1 tendrá una PK no de identidad int. Haría el mismo proceso para insertar en Table2, etc. Deje que SQL Server administre los valores de identidad en la tabla MasterID , que luego puede usar en sus otras tablas. Los MasterID pueden contener otras tablas, como type (para que pueda saber qué tabla, Table1 o Table2, etc., usa ese valor de identidad.


3

Mientras esté utilizando las restricciones de clave externa correctamente (en cascada, actualización, etc.), estará bien con el uso de un campo de identidad. Realmente no veo una ventaja para la otra solución en este caso.


2

La identidad se hizo para adaptarse a su escenario. Tiene herramientas como la replicación para el intercambio de datos de servidores / entornos que lo mantienen todo junto.


1

Acabo de terminar un trabajo en el que he reemplazado una identitycolumna de SQL Server con un intcampo normal y una asignación de Id controlada.

He visto ganancias de rendimiento bastante impresionantes. A diferencia del OP, no tengo un UDF para generar la identificación. Pero el principio es prácticamente el mismo: hay una parte del software que mantiene un grupo de id. Cuando se agotan, obtiene otro lote al consultar en la base de datos el siguiente valor bajo y lo incrementa al siguiente alto .

Esto nos permite generar identificadores y relacionar todas las entidades fuera de una transacción en nuestro ORM antes de enviar los lotes a la base de datos y también enviar lotes más grandes sin vueltas adicionales para obtener la identidad recién insertada (requerida por las columnas de identidad).

En la tabla de identificación que tenemos hay más de una fila, lo que nos permite usar rangos específicos si lo deseamos. es decir, para reutilizar bloques eliminados e identificadores negativos.


0

He estado usando identidad durante años y estoy considerando seriamente reemplazar el número de identidad con UNIQUEIDENTIFIER. Es una pesadilla cuando necesita cambiar el tipo de datos si alguien lo ha diseñado para ser una base de datos compacta y una pesadilla si necesita agregar identidad a una columna, además, no puede actualizar la columna de identidad. ¡Imagina que pones un int y tu base de datos crece más de 2 mil millones de registros, nuevamente pesadilla para cambiar (considera FK)! ¡Cambiar cualquier cosa con identidad es una pesadilla y no es escalable a menos que pongas bigint! IDENTIFICADOR ÚNICO vs Identidad = conveniencia y robustez vs quizás una mejora notable en el rendimiento (no hizo el punto de referencia).

Actualización: Después de ver esto , definitivamente me inclino hacia UNIQUEIDENTIFIER. ¡Esto no muestra un beneficio real de la identidad bigint y un montón de beneficios para UNIQUEIDENTIFIER! Las diferentes versiones de SQL Server podrían tener un resultado diferente. ¡Es maravilloso tener una identificación única en todas las bases de datos y sistemas (robustez)! ¡Mueva, copie, transforme datos como desee! https://www.mssqltips.com/sqlservertip/5105/sql-server-performance-comparison-int-versus-guid/


Un INT de 64 bits durará mucho, mucho tiempo ...
Vérace
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.