¿Cuáles son algunas de las trampas del diseño de la base de datos a tener en cuenta cuando se sabe que se accederá a la base de datos utilizando una Wikipedia de Object Relational Mapper (ORM) ? Consulte también Entity Framework NHibernate o LLBLGenPro.
Como ejemplo, notaré el límite del parámetro 2100 en la llamada RPC de SqlServer. Este es un problema cuando se utiliza LLBLgen y se unen tablas cuando se utilizaron claves primarias compuestas; consulte el artículo de MSDN para claves compuestas .
performance
orm
BozoJoe
fuente
fuente
Respuestas:
Ir a través de técnicas de normalización estándar, principalmente a la tercera forma normal. Algunos ORM pueden detectar las relaciones definidas en el nivel de la base de datos, por lo que no tendrá que hacerlo manualmente.
Realmente iría al revés y preguntaría qué debo saber sobre los ORM. Asegúrese de saber: - ¿Cómo perfilo las consultas? - ¿Cómo puedo anular el ORM y escribir mi propia consulta? - ¿Puedo usar procs almacenados en su lugar?
La base de datos debe ser independiente de ORM ya que, más que probable, durará más que la aplicación.
fuente
Nunca permita que el ORM cree o actualice el esquema. Siempre use su SQL generado como plantilla, pero revíselo antes de realizar el cambio (he visto que nuestro ORM crea índices redundantes, usa tipos de datos incorrectos ... todas esas cosas malas)
Tenga en cuenta lo que su ORM no puede hacer. Django por un tiempo no apoyó al grupo a través del ORM, lo cual fue una molestia (¡todavía lo es, los sistemas heredados son divertidos!). Por lo tanto, conocer las limitaciones del ORM es imprescindible para el DBA, incluso si no son quienes escriben el código para el ORM
Periódicamente, tome sus registros lentos, agrúpelos a través de mysqlslowlog y mire los 10 primeros más o menos. Básicamente, le mostrará las consultas que tomaron el mayor tiempo agregado en general. Una consulta que solo tomó un promedio de 1 segundo pero se ejecutó 50K veces en el último mes sobresaliría en ese informe agregado como un pulgar adolorido;)
No diría ir tan extremo como volcar el ORM por completo. Si los desarrolladores que usan el ORM no son DBA, es probable que escriban SQL tan malo o peor que el ORM. Entonces, eventualmente recaerá en el DBA para ver lo que sucede.
fuente
Hay algunas cosas que noto de inmediato sobre una base de datos heredada que difiere de una base de datos creada por ORM como Sequel y ActiveRecord para Ruby.
'id'
. Sí, eso se puede anular, peroid
es el predeterminado._id
adjuntos a claves externas: el diseño es típicamente similarreferenced_table_id
.He estado escribiendo mi SQL a mano durante años porque no confiaba en un ORM, pero en los últimos dos o tres comencé a usar los dos ORM mencionados anteriormente, y estoy impresionado por lo bien que se integran con las bases de datos existentes, y qué tan bien pueden descifrar una base de datos si se siguen sus convenciones, o me tomo el tiempo para darles las pistas necesarias para comprender una base de datos heredada.
No sé si hay pautas comunes para diseñar esquemas para jugar bien con ORM, pero creo que todos nos beneficiaríamos al tener algunos estándares. Definitivamente, hay un momento y un lugar para un ORM, especialmente si está utilizando un buen lenguaje OO y tiene un horario apretado.
fuente
Depende un poco (:)) de qué asignador OR esté usando, así que dedique algo de tiempo a investigar qué características de db el asignador OR en cuestión admite / no admite.
Por ejemplo, los mapeadores OR de Microsoft no son compatibles con todos los tipos de datos integrados de SQL Server, no son compatibles con algunas de las características TSQL más nuevas / avanzadas (consultas recursivas, sugerencias de optimizador, etc.).
En teoría , un buen mapeador OR debería ser lo suficientemente flexible como para superar (y permitirle mapear) un esquema de base de datos relacional bien diseñado a un buen modelo de objeto. En realidad, todavía nos queda un poco antes de que todas las piezas del rompecabezas estén en su lugar; aunque muchos mapeadores OR admiten mapeo avanzado, a menudo se producen a costa de consultas complejas y problemas de rendimiento.
Para un buen rendimiento de db (y para preservar la cordura de dba :)) aún debe seguir las mejores prácticas cuando se trata de diseño de esquema de db; normalice primero y desnormalice donde [/ if] sea necesario. En el lado del código, no vaya por la borda con su modelo de objeto ; incluso si el asignador OR admite modelos de herencia complejos y entidades que combinan muchas tablas juntas, estas también son las áreas en las que corre el riesgo de tener problemas con consultas demasiado complejas que afectan a la base de datos, etc. Perfil, perfil, perfil y no solo tome el ORM consultas generadas por sentado. Tenga en cuenta que las consultas generadas por el mapeador OR a menudo se pueden ajustar al igual que las consultas SQL normales y que dos consultas funcionalmente equivalentes en el lado del objeto (por ejemplo, consultas linq) a veces pueden dar lugar a consultas SQL muy diferentes.
fuente