Estoy en medio de un debate sobre si es mejor hacer una PRIMARY KEY
de 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_Value
por1
- use esto como un identificador único global
- O haga que la tabla haga un
id+1
al 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.
- poniendo el UDF en otra mesa donde podemos tener un UDF
¿Qué implementación tiene más sentido?
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.
fuente
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 MasterIDs
y obtiene la identidad generada por esa fila usandoSCOPE_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.
fuente
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.
fuente
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.
fuente
Acabo de terminar un trabajo en el que he reemplazado una
identity
columna de SQL Server con unint
campo 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.
fuente
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/
fuente