Estoy trabajando con SQL Server, y la mayoría de las tablas tienen columnas de identidad de tipo int. Y ahora, acabo de encontrar un libro, que dice que no es una buena idea usar este mecanismo. ¿Cuáles son los contras/pros de usar columnas de identidad cuando se usa NHibernate como ORM?Columnas de identidad del servidor SQL con NHibernate: para usar o no usar
Respuesta
No soy un experto en NHibernate, pero, por lo que yo entiendo, el uso de columnas de identidad rompe el UnitOfWork y ocasiona viajes de ida y vuelta adicionales a la base de datos.
Fabio Maulo (entonces líder del proyecto de NHibernate, no estoy seguro de si todavía es hoy en día) tiene un blog donde explica esto en detalle:
Identity: The never ending story
Aquí hay otro (más) blog con código de ejemplo:
NH2.1.0: generators behavior explained
Sin embargo, cabe destacar que ambas entradas del blog son unos tres años y hablan de NH 2.1.0, y la versión actual a partir de hoy es NH 3.3. Pero supongo que el problema descrito por Fabio todavía existe hoy.
Creo que hay un problema mayor ... Sí, el concepto de "unidad de trabajo" y todo es importante. ¡Pero la felicidad de SQL Server también es importante! Los GUID crean malas claves primarias en SQL Server (http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering-key.aspx) Así que en NH 3.x, ¿es factible usar identidad? (¡Necesitamos saber!) – Jonesome
No hay motivo por el que NHibernate no pueda generar SQL que devuelva la columna de identidad recién insertada en el mismo viaje que crea el registro. –
No, el punto es: cuando creas 20 objetos nuevos en un UnitOfWork, NH tiene que hacer un viaje redondo a la base de datos para cada uno con el fin de obtener el ID a través de Identity ... lo cual derrota el propósito de un UnitOfWork . Con otras estrategias de generación de ID, NH solo necesita hacer ** un ** viaje de ida y vuelta al final. –
No importa si se trata de una columna de identidad o no. La función de un ORM es asignar las entidades de datos a la base de datos para no dictar la estructura/diseño de la base de datos. He utilizado una implementación con columnas de identidad y funciona bien.
Sí, funciona. Es una cuestión de eficiencia. El uso de una columna de identidad u otro generador de claves primarias controlado por base de datos evita que NHibernate realice una agrupación de instrucciones INSERT. –
@Oskar - debe escribir una respuesta :) Gracias – dragonfly
La mayoría de las bases de datos admiten inserciones por lotes de una manera que devuelve la columna de identidad. Consulte la cláusula 'Output' en SQL Server para ver un ejemplo. (Si NHibernate lo hace o no es otro asunto). –
- 1. SQL tema de la identidad del servidor
- 2. ¿Nombre de columnas variables del servidor SQL?
- 3. DB: ¿Para utilizar la columna de identidad o no?
- 4. Para usar vistas o no usar vistas
- 5. ¿Puedo usar nHibernate con monotouch?
- 6. Para usar OpenID o no usar?
- 7. Para usar o no usar expresiones regulares?
- 8. NHibernate -Temporariamente desactivar identidad
- 9. Para usar goto o no?
- 10. ¿Usar SQL View o SQL Query?
- 11. ¿Es mejor usar un identificador único (GUID) o un bigint para una columna de identidad?
- 12. sql orden inverso del servidor después de usar desc
- 13. columna de identidad en el servidor Sql
- 14. Acerca de SVG (¿usar o no usar?)
- 15. Diferencia en el rendimiento del servidor SQL con la clave principal de una o varias columnas?
- 16. para usar o no usar C++ 0x cuenta
- 17. ¿Para usar o no usar el patrón de estado?
- 18. ¿Se puede usar varias columnas para una consulta no?
- 19. para usar o no usar el 'esto' calificador en C#
- 20. ¿Debo usar MSMQ o SQL Service Broker para las transacciones?
- 21. Cuándo usar (o no usar) un delegado
- 22. ¿Se transfiere la identidad del subproceso al usar extensiones PLINQ?
- 23. campos NHibernate identidad
- 24. ¿Vista del servidor SQL o función de valor de tabla?
- 25. ¿Puede una tabla de servidor sql tener dos columnas de identidad?
- 26. Uso de columnas de tiempo con NHibernate, NHibernate fluido y SQL Server 2008
- 27. ¿Qué ORM usar con SQL Azure?
- 28. ¿Para usar el objeto activo o no?
- 29. ¿Alguien ha usado (o considerado usar) Sql Server Compact Edition?
- 30. ¿Puedo usar funciones de SQL en NHibernate QueryOver?
Bueno, desde una perspectiva de base de datos, el profesional es que hay una manera robusta de identificar de manera única una fila en una tabla, especialmente dado que la tabla puede tener miles o millones de filas, etc. ¿De qué otra manera diferenciaría las filas? ¿Hay alguna otra ID/columna de referencia que sea única? ¿Se aplica la singularidad usando una restricción ÚNICA? –
@ChrisCannon La pregunta y la recomendación en las que se basa es ** no ** sobre la eliminación de la clave principal, pero solo sobre cómo se generan los valores de la clave principal. NHibernate puede funcionar más eficientemente cuando administra la generación de la clave primaria. –
He buscado en Google y no veo una buena respuesta a esta pregunta. Creo que la pregunta está abierta. NH quiere usar GUID ... pero los GUID son horribles como claves principales en SQL Server (ver http://www.sqlskills.com/BLOGS/KIMBERLY/post/GUIDs-as-PRIMARY-KEYs-andor-the-clustering- key.aspx). En nuestra base de datos, que es grande, podríamos ahorrar DOZENS de GB simplemente cambiando de GUID a identidad. Es hora de escribir mejor sobre este tema ... – Jonesome