2011-08-03 72 views
1

我知道這個事實,如果我使用Django的ORM,每個表都必須有一個主鍵列。不知怎的,如果有一個鏈接到桌的MANY_TO_MANY表(讓我們稱他們爲作者和書籍),你會得到這樣的:我可以在django(python)的MySQL表中避免多餘的主鍵列嗎?

id  author_id  book_id 
1  1    1 
2  1    2 
3  2    3 
etc. 

我也遇到過,其中建議,以避免列「ID」一書,而是創建一個複合主鍵。這是否與Django解決?

+0

我感興趣的論點/反對。哪裏的文章? – Sonny

+1

對於一個鏈接表,你不需要直接訪問它。只要使用Django的ManyToManyField,並指定鏈接表使用'through'參數。請參閱:https://docs.djangoproject.com/en/dev/topics/db/models/#many-to-many-relat ionhips –

+1

@Sonny:我寫了*文章*並且指* book *。它的標題是** SQL Antipatterns:避免由** Bill Karwin **編寫的數據庫編程**的陷阱。他指出,如果你必須在'author_id'和'book_id'上放置一個複合唯一約束(在上面的例子中)。如果你這樣做,複合鍵將具有與'id'列相同的屬性。所以它變得多餘。這段話很長,並有更多的論據,但我認爲這是它的本質,如果我沒有弄錯,那就是。 :-) – Aufwind

回答

2

您可以在您的通過表(使用ALTER TABLE)上創建一個複合主鍵。您也可以從表中刪除id列。由於ManyToMany字段在後端工作的方式,這些都不會損害django,所以它們不會使用id列。

但是你應該注意到讓複合PK在Django中工作基本上是一個非首發。這不應該是一個問題,因爲沒有表應該有一個ForeignKey到你的表中(至少因爲我能想到的任何原因)。

因此總的來說,複合主鍵不適用於django。所以如果你需要將一個ForeignKey放到一個帶有複合PK的表中,那麼你基本上是SOL。最後,在這裏沒有真正的使用複合PK的專業人士,但是沒有真正的合適的(在這個和唯一的情況下)。你花你的時間去擔心這個?

+0

我只是想了解作者的想法,並花費我對可做的知識。這裏沒有什麼生產力。順便說一句,請問* SOL *是什麼意思? – Aufwind

+0

SOL:http://www.urbandictionary.com/define.php?term=sol – Sonny

+0

可能作者的觀點是,通過創建多餘的唯一約束條件,您最終會爲該表格編寫兩個索引而不是一個;增加了少量的寫入開銷。並且將它關閉在id上的索引可能永遠不會被使用。在這種情況下,您最有可能用django安全地創建複合pk,但您無法將此體驗擴展到基本上任何其他關係 – John

相關問題