2012-01-03 62 views
1

我還沒有參加任何數據庫課程。請原諒我...基本模型設計:書籍和分類

從Django圖書教程,我們有一個圖書應用程序,最初有三個類(書,出版商和作者)。

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):創建BookCategories這需要類別爲ForeignKey的。

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

(符號:雙箭頭=多對多和單箭頭= ForeginKey)

哪個更好?如果沒有,我該如何解決這個問題?我的邏輯瑕疵在哪裏?如果第二次嘗試更好,原因是什麼?

非常感謝。

+0

您是否遇到第一種方法的問題,或者您只是要求提供信息? – 2012-01-03 08:32:20

+0

@DanielRoseman是的信息,或更好的「哪種方法似乎更好?」謝謝。 – CppLearner 2012-01-03 16:40:33

回答

1

我相信你所描述的方法或多或少都是相同的。多對多字段通常需要插頁式或「直通」表來存儲兩種對象類型之間的鏈接。

在你描述的第一種方法中,當你運行syncdb時,Django會自動創建直通表。在第二種方法中,您只是手動定義了該表格(儘管如您所指定的那樣,您將擁有一張冗餘表格)。第二種方法在某些情況下很有用,因爲這意味着您不僅可以定義鏈接,還可以存儲有關該鏈接的信息。在這種情況下,您可能有一個字段,用於存儲書籍首次添加到類別的時間或添加它的用戶。

欲瞭解更多信息,請檢查Django docs on many-to-many through tables

+0

嗨伊萬。這是一個很好的解釋和偉大的鏈接(仍然閱讀)。問題:通過自動生成的通過表,我們只能通過sql命令編輯我。因此,在django的框架下失去了controllin的靈活性,對吧?謝謝。 – CppLearner 2012-01-03 16:45:28

+0

一旦Django在您的數據庫中創建了一個表,它只能通過SQL命令進行修改。它以這種方式工作,以確保syncdb不能導致數據丟失。因此,通過使用自動生成的貫穿表,您實際上不會丟失任何表管理功能。如果你對更高級的數據庫管理感興趣,你應該查看South:http://south.aeracode.org/ – 2012-01-04 04:01:16

+0

謝謝。在閱讀你的答案後,我開始使用南方語言。真是太棒了:)謝謝。 – CppLearner 2012-01-04 04:19:42