Al usar un ORM, ¿cuáles son algunas cosas a tener en cuenta en el diseño de su base de datos?

19

¿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 .

BozoJoe
fuente
44
Sin ofender, pero "unir tablas con más de 1 clave principal" ... esto redefine una de las reglas básicas de una tabla, un PK individual por tabla. ¿A qué te refieres exactamente?
Marian
¿Cómo llega esto al límite del parámetro 2100? ¿Tienes tablas con tantas columnas? Además, supongo que te refieres a "Mapeo relacional de objetos" y no a "Modelado de roles de objeto"
John Saunders
El límite del parámetro 2100 a veces es un problema si pasa una lista grande de valores a un SQL 'IN' (matriz LINQ. Contiene (miembro)). Sin embargo, eso realmente no tiene nada que ver con el diseño de la base de datos; eso es más un problema de patrón de consulta. La solución más fácil para los ORM que 'sufren' de eso es insertar la lista en una tabla temporal [permanente] y unirse a eso y / o usar una subconsulta que seleccione los elementos que se consultarán desde donde se originen. (pasar miles de elementos a un SQL 'IN' generalmente es malo de todos modos, ya sea que esté utilizando un mapeador OR o no).
KristoferA
@John, sí Mapeo relacional de objetos
BozoJoe
44
@BozoJoe: una tabla puede, por definición, solo tener una clave primaria. No hay DBMS que le permita definir más de una clave primaria para una sola tabla.
a_horse_with_no_name

Respuestas:

17

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.

Eric Humphrey - lotsahelp
fuente
+1: "La base de datos debe ser independiente de ORM". Cumplir con los estándares para el diseño de bases de datos y los buenos ORM también estarán contentos.
MicSim
12
  1. 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)

  2. 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

  3. 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.

TechieGurl
fuente
1
Y considere poner una lógica muy compleja en un proceso almacenado. Los ORM pueden llamar a procesos almacenados y, para una lógica muy compleja, es más fácil ajustar el rendimiento de un proceso.
HLGEM
7

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.

  1. El uso de una clave primaria en todas las tablas llamadas 'id'. Sí, eso se puede anular, pero ides el predeterminado.
  2. El uso de nombres plurales para las tablas.
  3. El uso de guiones bajos ("snakecase") para separar las palabras creando el nombre descriptivo de las tablas y campos.
  4. El uso de _idadjuntos a claves externas: el diseño es típicamente similar referenced_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.

el hombre de hojalata
fuente
1
FYI: existen herramientas para tratar las diferencias de convención de nomenclatura para muchos mapeadores OR. Tengo un complemento para Visual Studio que se encarga de eso para Entity Framework y Linq-to-SQL con nombres basados ​​en reglas; visite huagati.com/dbmltools para obtener más detalles al respecto.
KristoferA
1
Id es un antipatrón SQL para nombrar el campo id y no debe usarse.
HLGEM
¿Te importaría explicar por qué? ¿Cómo manejamos las relaciones entre tablas cuando necesitamos hacer búsquedas como uno a muchos y muchos a uno? En los ORM que uso, no usar ID definitivamente va en contra de la corriente.
The Tin Man
2

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.

KristoferA
fuente