数据库设计ManyToMany,OneToMany,ManyToOne,Django模型

Jgl*_*art 6 django-models database-schema

对于具有特定关系的Django应用程序,我感到困惑.我一直在查看以下数据库模式:http://www.databaseanswers.org/data%5Fmodels/customers_and_orders/index.htm

我对Customer_addresses与Customers和Addresses之间的关系感到困惑.

我知道:

  • 一个客户可以拥有多个地址.
  • 许多客户可以拥有相同的(一个)地址

这是否等同于多对多的关系?

  • 很多客户可以拥有多个地址?

当我在django中构建模型时,我有(简化):

class Customer_Address(models.Model):
    customer = models.ManyToManyField('inventory.Customer')
    address = models.ManyToManyField('inventory.Address')
Run Code Online (Sandbox Code Playgroud)

这是正确的吗?或者这更有意义:

class Customer_Address(models.Model):
    customer = models.ForeignKeyField('inventory.Customer')
    address = models.ManyToManyField('inventory.Address')
Run Code Online (Sandbox Code Playgroud)

更新的问题:

基于这种想法,它是一个多对多的关系.有一个ManyToMany关系,需要两个ManyToManyFields吗?

基于以下内容:http: //en.wikipedia.org/wiki/Many-to-many_%28data_model%29

由于Django支持ManyToManyFields,我甚至不需要联结表吗?如果我使用联结表(Customer_addresses),文章似乎暗示使用两个OneToMany关系,这不仅仅是这样的两个外键?

class Customer_Address(models.Model):
    customer = models.ForeignKeyField('inventory.Customer')
    address = models.ForgeinKeyField('inventory.Address')
Run Code Online (Sandbox Code Playgroud)

更新的问题:

现在我们知道Django构建了中间表,并且不需要表Customer_Addresses.哪个表应该有ManyToManyfield?客户表?还是地址表?

示例:https://docs.djangoproject.com/en/dev/topics/db/models/#intermediary-manytomany

在Person/Groups示例中.. Groups具有ManyToManyField.是否有任何原因无法在Person表中定义ManyToManyfield?

Chi*_*unk 6

总结一下

对于第一个问题.

当一段关系表明这一点

  • 一个客户可以拥有多个地址.

  • 许多客户可以拥有相同的(一个)地址

比它显然是一个多对多的关系,并始终使用ManyToManyField

现在是第二个问题.

如果您想要一个在两个多对多实体之间有额外字段的中间表(表/模型),该怎么办?

比从另外两个模型创建一个具有ForiegnKey的新模型.如在

class Person(models.Model):
    name = models.CharField(max_length=128)

    def __unicode__(self):
        return self.name

class Group(models.Model):
    name = models.CharField(max_length=128)
    members = models.ManyToManyField(Person, through='Membership')

    def __unicode__(self):
        return self.name

class Membership(models.Model):
    person = models.ForeignKey(Person)
    group = models.ForeignKey(Group)
    date_joined = models.DateField()
    invite_reason = models.CharField(max_length=64)
Run Code Online (Sandbox Code Playgroud)

更多阅读