with tutorial password net español asp and c# asp.net asp.net-identity

c# - password - asp.net identity tutorial español



¿Por qué ASP.NET Identity 2.0 usa un GUID/cadena como ID de usuario? (5)

Como de costumbre, Microsoft piensa en la "simplicidad" más que en ser realmente útil y eficaz. Sí, GUID es único en todo el sistema, sí, puede probarlo sin vaciar la nueva ID de la base de datos ... PERO ...

Ni siquiera voy a debatir los índices de DB en los que estoy seguro que muchos pensaron. Aquí hay otra desventaja de las cuerdas. Incluso si uso BIGINT en la base de datos como el ID de usuario, todavía es solo 8 bytes vs varchar (128). Comprendo que el espacio en disco es barato en estos días, pero ¿por qué tengo que saturar mi db con cosas innecesarias? Cualquier persona que haya trabajado en cualquier proyecto que involucre a millones de usuarios desaprobará las cadenas como su nombre de usuario. Todas las respuestas de Microsoft sobre "por qué usaron cadenas" son básicamente respuestas de borrado.

Por supuesto, dirán: "puedes cambiarlo para usar INT, BIGINT, etc." Claro, tienes que cambiar miles de clases, implementar tu propia tienda de usuarios, etc. Bueno ... algo tan simple tiene que ser así. Complicado.

/ final rant

Como dice el título, me pregunto por qué ASP.NET Identity 2.0 usa una cadena con un GUID como clave agrupada principal para la tabla de usuarios. ¿Esto tiene alguna ventaja para un ID entero? Solo veo el problema, que un GUID no es la mejor opción para un índice agrupado.

¿Me estoy perdiendo algo o un entero sigue siendo la mejor opción?


Con respecto al uso de guid, hay un punto de vista que promueve el uso de identificadores sin "significado" para separar completamente el identificador de los datos que lo rodean; esta identificación no debe ser visible desde fuera del almacén de datos. Si observamos algunas características de una clave sustituta , tenemos las siguientes

  • El valor es único en todo el sistema, por lo tanto, nunca se reutiliza.
  • el valor es generado por el sistema
  • El valor no es manipulable por el usuario o la aplicación.
  • el valor no contiene significado semántico
  • El valor no es visible para el usuario o la aplicación.
  • el valor no se compone de varios valores de diferentes dominios.

Por lo tanto, una guía se ajusta a la factura, ya que de hecho es generada por el sistema y no tiene relación con el dominio. Creo que el uso de un guid es principalmente una cuestión de tendencia en esta forma particular de pensar; sin embargo, dado que están introduciendo un nuevo mecanismo de "clave principal extensible", la clave se puede cambiar, por lo que puede recurrir a un entero para su PK .

Con respecto al rendimiento, le dirijo a este hilo donde la respuesta aceptada dice:

Los GUIDs pueden parecer una elección natural para su clave principal, y si realmente debe hacerlo, probablemente podría argumentar que lo usará para la CLAVE PRIMARIA de la tabla. Lo que recomiendo encarecidamente que no haga es usar la columna GUID como la clave de agrupación en clúster, que SQL Server hace de forma predeterminada, a menos que específicamente le indique que no lo haga.

Realmente necesitas separar dos cuestiones:

  • la clave principal es una construcción lógica, una de las claves candidatas que identifica de forma única y confiable cada fila de su tabla. En realidad, esto puede ser cualquier cosa: una INT, un GUID, una cadena, lo que tiene más sentido para su situación.
  • la clave de agrupamiento (la columna o columnas que definen el "índice agrupado" en la tabla): esto es algo relacionado con el almacenamiento físico, y aquí, un tipo de datos pequeño, estable y en constante crecimiento es su mejor opción: INT o BIGINT como su opción por defecto.

lo que confirma completamente su impresión.


Supongo que por "a un ID" quiere decir una ID integral secuencial, como un UUID es, después de todo, una ID.

Si absolutamente nadie usaba Identity 2.0, o una versión futura, alguna vez quiso fusionarse, o combinar más de una tienda, o alguna vez importar usuarios y / o roles, entonces una identificación numérica funcionaría.

Si solo unas pocas personas lo hacen, o incluso podrían hacerlo, entonces un UUID tiene mucho más sentido.

Se debe presentar un argumento para usar una clave natural, como un nombre de usuario, con los pros y los contras de que sea bien explorado en general. IIRC, de hecho lo hicieron la primera vez.

En total, un UUID parece una opción obvia.


Un Guid como UserId (por lo tanto, la clave principal) puede ser tu mejor amigo a veces.

Algo para considerar cuando las personas "despotrican" contra un GUID es que no están considerando aplicaciones "conectadas ocasionalmente" por las cuales no puede acceder a la base de datos para obtener el valor del campo de identidad "int" hasta su reconexión, pero necesita crear múltiples registros en varios Tablas enlazadas sin conexión. Tener un Guid permite que la aplicación cree un "usuario" y, por lo tanto, el "ID de usuario" como la clave principal sin colisiones cuando se sincroniza cuando está de nuevo en línea.

Para evitar impactos de rendimiento, no coloque Guid en el índice de agrupación. Siempre se puede usar un campo único diferente como el ID de clúster o incluso usar un campo de identidad entero incrementado en uno como "clusterId" y usarlo en su lugar.

Otra razón es cuando está agregando datos de muchas fuentes diferentes, si el UserId (clave principal) es un Guid, puede evitar colisiones.


Las otras respuestas son excelentes, sin embargo, una ventaja que no he visto mencionada es que Guid.NewGuid() (teóricamente) crea una ID única sin comprometer la fila en la base de datos.

Una columna de identidad basada en enteros requiere un vaciado de base de datos para obtener su ID. Hay algunas circunstancias en las que es útil tener el PK para su fila generado en código y pasado a la base de datos (obviamente, hay otras formas de lograrlo con una restricción única, pero Guid es una opción razonablemente buena).