数据库设计:订购多对多关系

时间:2010-09-16 17:22:08

标签: database django database-design django-models

在Django中,我有以下模型:

class Pink(models.Model):
    ...

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



在某些时候,我需要在Pinks内定义White的排序 (为了拥有White1.pinks: P1, P2, P3而不是随机White1.pinks: P2, P3, P1, 所以我创造了

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']



问题1:这是更好的解决方案吗?

问题2:这显然是多余的:我的pinks模型中仍然有一个White字段,因为我在其他不需要的情况下需要它排序。我可以保留它,或者删除它是否更好,并且总是使用PinkInWhite关系模型?




(模型名称是虚构的。为简化问题,我没有使用模型的真实姓名,而且谈论X先生和Y先生不会有助于提高可读性......)

1 个答案:

答案 0 :(得分:1)

这取决于您的预期用途的定义。

如果您只是在白色中寻找一组有序的粉红色,您可以将所有内容放在一个表格中,并避免使用联结表格PinkInWhite

但如果您将来想要除了红色之外还有其他色调,那么将粉红色直接绑在白色上是太严格了。只需留下白色作为白色,并创建一个连接表,将粉红色连接到适当的白色(订购)。然后你就可以灵活地制作蓝调,黄色等等。

但是对你的问题的简短回答,你所拥有的将是可用的。