2012-01-03 14 views
1

私はデータベースコースを受講していません。どうかお待ちください...基本モデルデザイン:書籍とカテゴリ

Django Bookチュートリアルから、当初は3つのクラス(ブック、出版社、著者)を持つブックアプリケーションがあります。

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    # categories = models.ManyToManyField(Category) 
    authors = models.ManyToManyField(Author) 
    publisher = models.ForeignKey(Publisher) 
    publication = models.DateField() 

書籍を複数の著者にマッチさせることができますが、書籍のみを出版社に一致させることができます。

本はいくつかのカテゴリを持つことができますので、私が上記でコメントしたものを書くのは当然のようです。

class Category(models.Model): 
    name = models.CharField(max_length=40) 

第二の試み:

私は(vaugly)このどこを読んで覚えている:ForeignKeyのようカテゴリーを取るBookCategoriesを作成します。

Book --> --> BookCategories --> Categroy 

(表記:二重矢印=多対多とシングル矢印= ForeginKey)は

どちらが良いですか?もしそうでなければ、私はこれにどのようにアプローチするのですか?論理的な欠陥はどこにありますか? 2回目の試みが良ければ、理由は何ですか?

ありがとうございました。

+0

最初のアプローチに問題がありますか、または単に情報を求めていますか? –

+0

@DanielRosemanはい情報、またはより良い "アプローチが良いようですか?"ありがとう。 – CppLearner

答えて

1

私があなたが記述したアプローチは多かれ少なかれ同一であると信じています。多対多のフィールドでは、2つのオブジェクトタイプ間のリンクを格納するために常にインタースティシャルまたは 'スルー'テーブルが必要です。

あなたが説明した最初のアプローチでは、syncdbを実行すると自動的にDjangoがスルーテーブルを作成します。 2番目のアプローチでは、テーブルを手動で定義しました(指定したとおり、冗長テーブルがあります)。第2のアプローチは、リンクを定義するだけでなく、そのリンクに関する情報も格納できるという意味で、状況によっては便利です。この場合、書籍が最初にカテゴリに追加された時刻、または追加したユーザーを格納するフィールドがあります。

詳細については、Django docs on many-to-many through tablesをご覧ください。

+0

こんにちは。それは素晴らしい説明と素晴らしいリンクです(まだ読書しています)。質問:自動生成されたテーブルを通して、私はSQLコマンドでしか編集できません。したがって、それは柔軟性を失うdjangoのフレームワークの下で、それを制御しますか?ありがとうございました。 – CppLearner

+0

Djangoがデータベースにテーブルを作成すると、SQLコマンドでのみ変更できます。これはsyncdbがデータ損失を引き起こさないことを保証するためにこのように動作します。したがって、自動生成されたスルー表を使用して、実際に表管理機能を失うことはありません。より高度なデータベース管理に興味がある場合は、Southをチェックしてください:http://south.aeracode.org/ –

+0

ありがとうございました。私は本当にur答えを読んだ後、南を使用して始めました。本当は本当に素晴らしいです:)ありがとう。 – CppLearner

関連する問題