2012-01-16 3 views
2

質問があります。私は最初のデータベースをまとめ、次のような設計上の問題があります。ブックを定義するクラス(タイトルなど)とページを定義するクラス(たとえばデザイン)を持っています。Djangoデータベース設計:多対多、外部キー、またはどちらも使用できません。

クラス帳のテーブルはそうなります

Title  | PAGE1  | PAGE2  | PAGE3 
Book-One  | SAMPLE1-UUID | SAMPLE2-UUID | SAMPLE3-UUID 
Book-Two  | SAMPLE4-UUID | SAMPLE5-UUID | SAMPLE6-UUID 

クラスのページの表を:

UUID   | FONT   | CONTENTS etc. 
SAMPLE1-UUID | Times  | Example 
SAMPLE2-UUID | Arial  | Example Two 
SAMPLE3-UUID | Verdena  | Example Three 

さて、各ページが一意であり、再利用することができないよう別の本では、Pagesに多対多の関係を使用することはできません。 Foreign-Keyを使用して2つのテーブルをリンクすることができます。つまり、ブックテーブルのSAMPLE1-UUIDとページテーブルのSAMPLE1-UUIDをリンクします。これには、同じエントリを2回作成しないという利点があります。

しかし、自分のページに一定量の行があるという考えは嫌いです。 Bookクラスの上記の例では、PAGE1、PAGE2、PAGE3、PAGE4、... PAGE99のような特定のページセットを定義する必要があります。

Name   | Pages 
Book-One  | "SAMPLE1-UUID, SAMPLE2-UUID" 
Book-Two  | "SAMPLE4-UUID, SAMPLE5-UUID, SAMPLE6-UUID" 

ページはシンプルCharFieldですだろうと、その内容がリストのようになります。理想的には、私が必要とするすべてはそうのように、私の本クラスのページの柔軟なリストです。しかし、2つのテーブルがもうリンクされておらず、各エントリを2回作成する必要があるという問題があります(つまり、ページとブックの両方のテーブルにSAMPLE1-UUIDを入力する必要があります)。

このデータベースを設計する別の方法はありますか?ご意見ありがとうございます!

答えて

5

私はあなたが列としてページを持っていないお勧めします

Title  | ISBN   
Book-One  | XXXXXXXXXXXX 
Book-Two  | YYYYYYYYYYYY 

クラスのページの表:

BOOKID  |PAGE_NUM | FONT   | CONTENTS 
1   |1  | Times  | Example 
1   |2  | Arial  | Example Two 
2   |1  | Verdena  | Example Three 

あなたのクラスの設計は、次のようになります。

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    isbn = models.CharField(max_length=100) 

class Page(models.Model): 
    book = models.ForeignKey(Book) 
    page_num = models.IntegerField() 
    font = models.charField(max_length=100) 
    content = models.TextField() 

書籍やpage_numが繰り返されないようにすることができますが、これは良いスタートになります。

+0

Keniに感謝します。私の唯一の問題は、私がDjango管理インターフェースにログインして、各ページにどのページがあるのか​​わかりません。 Daniel Rosemanはmy_book.page_set.all()を使用するよう提案しましたが、この場合はどのように変換されるのか分かりません。これを私のadmin.pyに追加できますか?管理インターフェースに関係なく、ID 1の本のすべてのページのリストをどのように取得しますか?あなたの助けをありがとう、非常に感謝! –

+1

@ n.evermind 'admin.StackedInline'はあなたが探しているものです。 [Djangoのドキュメント](https://docs.djangoproject.com/ja/1.3/intro/tutorial02/#adding-related-objects) – juliomalegria

3

私はこのようにそれを行うだろう:

class Book(models.Model): 
    name=models.CharField(max_length=....) 

class Page(models.Model): 
    book=models.ForeignKey(Book) 
    number=models.PositiveIntegerField() 

私はあなたの本テーブルの例を理解していない:あなたはPage1のためのコラムやPAGE2のための他の列をしたいですか?それは非常に奇妙に見えます。

+0

ありがとうGuettli。はい、理想的には、すべてのページとそのレイアウト属性を一覧表示するテーブルを用意したいと思います。 2冊の書籍があり、5冊の書籍がある場合、私のページテーブルには10冊のエントリがあります。あるいは、この悪いデータベース設計ですか?ご協力いただきありがとうございます! –

1

あなたは外来キーの仕組みを誤解しています。実際には、それは「固定量の行」ではありません。

guettliが彼の答えで示しているように、ForeignKeyフィールドは「多」側で定義された一対多の関係です。つまり、ForeignKeyがBookを指しているページで定義されている場合、各ページには1つのBookがありますが、Bookには好きなだけ多くのPagesがあります。

Django ORMを使用すると、ブックオブジェクトがあり、すべてのページを取得したい場合は、my_book.page_set.all()を実行します。

書籍情報だけでそうなりますクラス帳のテーブル::

+0

ありがとう!!はい、私は "一つ"の側で "多くの"側を台無しにしました。どのように役立つ。今はもっと意味をなさない。つまり、データベースに本を入力すると、そのページは気にしません。今私の唯一の問題:私は私のdjango管理データベースインターフェイスで本を見て、私はそれが持っているページが表示されません。または、book.page_set.all()でこれを追加できますか?いずれにしても、あなたの助けをありがとう! –

+1

変更フォームでは、[inline modeladmin](https://docs.djangoproject.com/ja/1.3/ref/contrib/admin/#inlinemodeladmin-objects)を使用して、ブックのすべてのページを表示/編集できます。 –

関連する問題