Pregunta

Actualmente estoy ocupado haciendo un ORM Python, que obtiene toda su información de un RDBMS a través de la introspección (Me gustaría ir con XRecord si estaba contento con él en otros aspectos) - es decir, el usuario final sólo se indica qué tablas / vistas a la vista, y el ORM hace todo lo demás de forma automática (si hace algo que realmente escritura y usted no está buscando cosas extrañas y peligrosas aventuras, es un error).

La mayor parte de esa es la detección de las relaciones, siempre que la base de datos tiene todas las restricciones pertinentes en su lugar y que no han convenciones de nombres en todos - Quiero ser capaz de tener este trabajo ORM con una base de datos hecha por cualquier DBA loca cuales tiene sus propios puntos de vista sobre lo que las columnas y tablas deben ser nombrados similares. Y yo estoy atrapado en las relaciones de muchos a muchos.

En primer lugar, no puede haber claves compuestas . Entonces, no puede haber MTM relaciones con tres o más tablas . A continuación, una tabla intermediario MTM podría tener sus propios datos, aparte de las teclas -. Algunos datos comunes a todas las tablas que une

Lo que quiero es un método para detectar mediante programación que una tabla X es una tabla de intermediario atar los cuadros A y B, y que los datos no son clave que tiene deben pertenecer a ambos A y B (y si cambio de un atributo común desde dentro de a, se debe afectar el mismo atributo en B). ¿Hay algoritmos comunes de hacer eso? O al menos de hacer conjeturas que están justo en el 80% de los casos (siempre que el DBA es cuerdo)?

¿Fue útil?

Solución 3

Hasta ahora, veo la única técnica que abarca más de dos tablas en relación. Una tabla X se supone relacionada con mesa Y, si y sólo si X se hace referencia a Y no más de una tabla de distancia Esto es:.

"mesas de distancia cero" significa X contiene la clave externa a Y. No es gran cosa, así es como detectamos muchos-a-uno.

"Una mesa lejos" significa que hay una mesa de Z que a su vez tiene una clave externa que hace referencia la tabla X (estos son fáciles de encontrar), y una tabla de clave externa que hace referencia S.

Esto reduce el alcance de los rasgos para tener en cuenta una gran cantidad (que no tiene que preocuparse si la tabla intermediaria tiene otros atributos), y cubre cualquier número de tablas atadas juntas en una relación MTM.

Si hay algunos enlaces de interés u otros métodos, que estoy dispuesto a escucharlos.

Otros consejos

Si usted tiene que pedir, usted no debe hacer esto. No estoy diciendo que para ser cruel, pero Python ya tiene varios excelentes ORM que están bien probadas y ampliamente utilizados. Por ejemplo, SQLAlchemy admite el atributo autoload=True la hora de definir las tablas que hace que se lea la definición de tabla - incluyendo todas las cosas que estás preguntando por - directamente de la base de datos. ¿Por qué reinventar la rueda cuando alguien ya ha hecho el 99,9% de la obra?

Mi respuesta es escoger un ORM Python (como SQLAlchemy) y añadir cualquier funcionalidad "perdido" para que en lugar de empezar desde cero. Si resulta ser una buena idea, liberar sus cambios de nuevo al proyecto principal, de modo que todo el mundo puede beneficiarse de ellos. Si no funciona como usted esperaba, al menos que ya va a utilizar un ORM común que muchos otros programadores que pueden ayudar.

En teoría, cualquier tabla con varias claves externas es, en esencia, una relación de muchos a muchos, lo que hace que su pregunta trivial. Sospecho que lo que necesita es una heurística de cuándo utilizar patrones MTM (en lugar de las clases estándar) en el objetos modelo. En ese caso, examinar cuáles son las limitaciones de los modelos que ha elegido.

Por ejemplo, se puede modelar una relación simple MTM (dos mesas, no hay atributos) por tener listas como atributos de ambos tipos de objetos. Sin embargo, las listas no serán suficientes si tiene datos adicionales sobre la relación misma. Por lo que sólo invocar este patrón para las tablas con dos columnas, ambas con claves externas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top