2010-09-16 2 views
3

Dans Django, je les modèles suivants:Database Design: commander plusieurs-à-plusieurs

class Pink(models.Model): 
    ... 

class White(models.Model): 
    ... 
    pinks = models.ManyToManyField(Pink) 
    ... 



À un moment donné, je devais définir un ordre de Pinks dans un White (afin d'avoir White1.pinks: P1, P2, P3 au lieu d'un White1.pinks: P2, P3, P1 aléatoire), donc j'ai créé

class PinkInWhite(models.Model): 
    pink = models.ForeignKey(Pink) 
    white = models.ForeignKey(White) 
    position = models.PositiveIntegerField("pink's position inside this white") 

    class Meta: 
     ordering = ['white','position'] 



Question 1: est-ce la meilleure solution?

Question 2: Ceci est évidemment redondant: Il me reste un champ pinks dans mon modèle White, parce que je besoin dans d'autres situations qui ne nécessitent pas une commande. Puis-je le conserver, ou est-il préférable de l'enlever, et toujours utiliser le modèle de relation PinkInWhite à la place?




(noms de modèles sont fictifs. Pour simplifier la question que je n'ai pas utilisé les vrais noms de modèle, et parler de M. X et M. Y ne contribueraient pas à la lisibilité ...)

Répondre

1

Cela dépend de la façon dont votre utilisation prévue est définie.

Si vous recherchez simplement un ensemble de roses ordonnés en blanc, vous pouvez tout ranger dans une table et éviter la table de jonction PinkInWhite.

Mais si vous voulez à l'avenir avoir d'autres teintes que des teintes de rouge, alors avoir des roses liées directement au blanc est trop restrictif. Il suffit de laisser les blancs en blanc et de créer une table de jonction reliant les roses aux blancs appropriés (avec la commande). Ensuite, vous avez la possibilité de faire des nuances de bleus, jaunes, peu importe.

Mais la réponse courte à votre question, ce que vous avez sera utilisable.

+1

Si vous utilisez une table de jonction/table de jonction, la façon dont elle est implémentée dans Django est connue sous le nom de modèle Through - voir http://docs.djangoproject.com/en/dev/topics/db/models/ # extra-fields-on-many-to-many-relations –