7

データベース設計が特定の関係を持つ Django アプリケーションに適用される限り、私は混乱しています。私は次のデータベース スキーマを見てきました: http://www.databaseanswers.org/data%5Fmodels/customers_and_orders/index.htm

Customer_addresses と Customers と Addresses の関係について混乱しています。

そんなこと知ってる:

  • 1 人の顧客が複数のアドレスを持つことができます。
  • 多くの顧客が同じ (1 つの) 住所を持つことができます

これは多対多の関係に相当しますか?

  • 多くの顧客は多くのアドレスを持つことができますか?

私がdjangoでモデルを構築しているとき、私は(単純化された):

class Customer_Address(models.Model):
    customer = models.ManyToManyField('inventory.Customer')
    address = models.ManyToManyField('inventory.Address')

これは正しいですか?または、これはより理にかなっていますか:

class Customer_Address(models.Model):
    customer = models.ForeignKeyField('inventory.Customer')
    address = models.ManyToManyField('inventory.Address')

更新された質問:

多対多の関係であるという考えに基づいています。1 つの ManyToMany リレーションには 2 つの ManyToManyFields が必要ですか?

以下に基づく: http://en.wikipedia.org/wiki/Many-to-many_%28data_model%29

Django は ManyToManyFields をサポートしているので、ジャンクション テーブルさえ必要ないのですか? そして、ジャンクション テーブル (Customer_addresses) を使用する場合、記事は 2 つの OneToMany リレーションシップを使用することを暗示しているようですが、これはこのような 2 つの外部キーではないでしょうか?

class Customer_Address(models.Model):
    customer = models.ForeignKeyField('inventory.Customer')
    address = models.ForgeinKeyField('inventory.Address')

更新された質問:

これで、Django が中間テーブルを作成し、Customer_Addresses テーブルは不要であることがわかりました。ManyToManyfield を持つテーブルはどれですか? 顧客テーブル?またはアドレステーブル?

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

Person/Groups の例では.. Groups には ManyToManyField があります。Person テーブルで ManyToManyfield を定義できなかった理由はありますか?

4

2 に答える 2

8

総括する

最初の質問について。

関係がそれを述べているとき

  • 1 人の顧客が複数のアドレスを持つことができます。

  • 多くの顧客が同じ (1 つの) 住所を持つことができます

明らかに多対多の関係であり、常にManyToManyFieldを使用します

次に、2 番目の質問です。

2 つの多対多エンティティ (テーブル/モデル) の間に余分なフィールドを持つ中間テーブルが必要な場合はどうなりますか?

他の 2 つのモデルからの 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)

もっと読む

于 2012-12-15T18:55:58.313 に答える
2

コメントに返信するのに十分なポイントがないようです。したがって、上記の質問に答えるには、実質的に違いはありません。Django ドキュメントの例が示すように、Person が属する Groups のセットと、Group に属する Persons のセットを照会できます。

>>> ringo = Person.objects.create(name="Ringo Starr")
>>> paul = Person.objects.create(name="Paul McCartney")
>>> beatles = Group.objects.create(name="The Beatles")
>>> m1 = Membership(person=ringo, group=beatles,
...     date_joined=date(1962, 8, 16),
...     invite_reason= "Needed a new drummer.")
>>> m1.save()
>>> beatles.members.all() # Get all Persons of a Group here
[<Person: Ringo Starr>]
>>> ringo.group_set.all() # Get all Groups for a Person here
[<Group: The Beatles>]
>>> m2 = Membership.objects.create(person=paul, group=beatles,
...     date_joined=date(1960, 8, 1),
...     invite_reason= "Wanted to form a band.")
>>> beatles.members.all()
[<Person: Ringo Starr>, <Person: Paul McCartney>]
于 2013-06-04T20:36:39.980 に答える