2009-10-26 24 views
14

Estoy escribiendo una aplicación web para mi empresa de ingeniería (advertencia: soy programador solo por afición) y estaba pensando en usar Django hasta que llegue a este inconveniente. Los modelos que quiero usar naturalmente tienen claves primarias de múltiples columnas. Por http://code.djangoproject.com/ticket/373, no puedo usar Django, al menos no una versión lanzada. ¿Alguien puede ayudarme con una solución, ya sea a través de otro marco web (solo basado en Python, por favor) o sugiriendo cambios al modelo para que funcione con las limitaciones de Django? Realmente espero lo último, ya que esperaba usar esto como una oportunidad para aprender Django.Django o similar para claves primarias compuestas

Ejemplo: La tabla uno tiene part_number y part_revision como dos campos que deben comprender una clave principal. Un P/N puede existir en múltiples revisiones, pero P/N + rev son únicos.

La tabla dos tiene part_number, part_revision y dimension_number como clave principal. Un P/N a una revolución específica puede tener varias dimensiones, sin embargo, cada una es única. Además, en este caso, P/N + rev debe ser una ForeignKey de la Tabla uno.

Respuesta

19

Una alternativa es crear una clave sustituta (una columna de incremento automático) como la columna de la clave principal y colocar un índice único en la clave compuesta del dominio.

Las claves externas se referirán a la columna de la clave primaria sustituta.

+1

+1 - me adelantó. –

23

¿Por qué no agregar una clave primaria normal y luego especificar que part_number y part_revision como unique_together?

Esta es esencialmente la manera Djangoish (Djangonic?) De hacer lo que dijo Mitch Trigo.

+0

¡Guau! esta es realmente la mejor solución! –

+1

Djangonic en armonía con Pythonic :) – ajay

14

Sugiero utilizar una clave sustituta. No porque sea "Djangoesque". Supongamos que usa una clave compuesta que incluye part_number. ¿Qué pasa si algún tiempo después su empresa decide cambiar el formato (y, por lo tanto, los valores) de ese campo? O en términos generales, cualquier campo? No querrá lidiar con el cambio de claves primarias. No conozco el beneficio que se ve al usar una clave compuesta que consta de valores "reales", pero reconozco que no vale la pena la molestia. Use claves sin significado, autoincrementadas (y que probablemente deban hacer que una clave compuesta sea inútil).

+4

Esto debería modificarse mucho. Un buen artículo sobre por qué los sustitutos son una mejor idea es: http://www.agiledata.org/essays/keys.html – cethegeek

+0

El gran problema con la industria del software es que todos están tratando de solucionar el problema dado en una escala mayor. ¿Qué sucede si, por otro lado, estoy tratando de aplicar Django a un conjunto de datos predefinido cuya estructura puede o no modificarse? Lo que es más importante es que este es uno de los casos de uso de Django: un "marco para perfeccionistas con plazos". –

2

SQLAlchemy tiene soporte para claves compuestas primarias y externas, por lo que cualquier marco basado en SQLAlchemy (Pylons y Werkzeug viene a la mente) debe satisfacer sus necesidades. Pero la clave primaria sustituta es más fácil de usar y mejor soportada de todos modos.

0

si quieres campos mixtos única únicas:

class MyTable(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1 = models.IntegerField() 
    key2 = models.IntegerField() 

Pero si quieres única juntos y uno de la columna se intente primaria similar abajo código:

class MyTable(models.Model): 
    class Meta: 
     unique_together = (('key1', 'key2'),) 

    key1 = models.IntegerField(primary_key=True) 
    key2 = models.IntegerField() 
Cuestiones relacionadas