2009-08-11 26 views
0

什麼是具有第一1之間的連接表的優點米關係?爲什麼有1連接表:M和第二個1:在下面的數據庫米關係在SQL

alt text http://dl.getdropbox.com/u/175564/db/db-simple.png

喬·塞科的樹木和層次結構在SQL爲Smarties一說,原因是有1獨特的關係:米的。例如,以下表格可以讓用戶分別詢問完全相同的問題兩次,並分別給出完全相同的答案兩次。

第一個1:M的關係

users-questions 
=============== 
user_id REFERENCES users(user_id) 
question_id REFERENCES questions (question_id) 
PK(user_id, question_id)   // User is not allowed to ask same question twice 

第二個1:M關係

questions-answers 
================= 
question_id REFERENCES questions(question_id) 
answer_id REFERENCES answers(aswer_id) 
PK(question_id, answer_id)  // Question is not allowed to have to same answers 

這樣做的好處有關唯一沒有說服我,使我的代碼更具挑戰性。 我不明白爲什麼我應該限制在db中使用相同ID的問題或答案的可能性,因爲我也許可以使用PHP來禁止這一點。

+0

謝謝你的回答! – 2009-08-12 01:08:13

+0

切勿將此類型的規則放在業務層中。這是要求數據完整性的麻煩。除了應用程序之外的其他事情可能會影響數據庫中的數據,從不依賴於只觸摸它的應用程序。必須始終執行的任何規則(如唯一性)必須位於數據庫中。 – HLGEM 2009-08-12 14:24:17

回答

2

它通常是由於數據的重複。

至於你的推理,是的,你可以在業務層執行,但如果你犯了一個錯誤,它可能打破代碼顯著量。你的問題是你的數據模型可能只有幾個表。幸運的你。當數據模型增長時,如果您無法理解結構,並且必須將所有邏輯在GUI層中保留非規格化表格,那麼您可能很容易遇到問題。請注意,在您的SQL數據庫的GUI上很難使用線程安全技術,而不使用會導致性能下降的鎖定。

DBMS非常善於處理這些問題。您可以保持數據模型清潔並使用索引來爲您提供所需的速度。你的目標應該是先讓它正確,並且只有在你明確需要這樣做時(例如性能等)才能對錶格進行denormal化。

信不信由你,很多情況下,規範化的數據使你當涉及到你的應用程序時,生活更輕鬆,不會更難。例如,如果你有一個包含問題和答案的大表,你必須編寫代碼來檢查它是否是唯一的。如果你有一個主鍵的表,你只要寫

insert into table (col1, col2) values (@id, @value) --NOTE: You would probably 
--make the id column an autonumber so you dont have to worry about this 

該數據庫將阻止你插入,如果你有一個非唯一值存在,或者如果您將在沒有問題的答案。所有你需要做的是檢查插入是否工作,沒有更多。你認爲哪一個代碼少?

3

好,獨特的關係一點似乎無意義對我來說,可能是因爲我已經習慣了的DBMS,你可以定義比主鍵之外唯一鍵。在我的世界裏,就像那些映射表是如何實現多對一對多的關係,並利用它們爲一個一對多的關係是瘋狂—我的意思是,如果你這樣做,也許你打算的關係以一對多的方式使用,但實際上實現的是是多對多的支持。

我不跟你說什麼有是在持久層沒有實用獨特的複合鍵,因爲您可以實現在應用層,雖然同意。持久層唯一性約束有很多難以複製的好處,例如在MySQL中,可以利用INSERT ... ON DUPLICATE KEY UPDATE

+0

我不知道MySQL的命令。 **哪個數據庫你會選擇沒有連接表的數據庫或在我的情況下與連接表的數據庫?** - 是否值得使用連接表代碼更具挑戰性? – 2009-08-11 23:34:43

1

我同意在這種情況下一對多的連接表似乎沒有多少好處,正如@chaos所說,您實際上最終實現了多對多支持。但是喬·塞爾科是個聰明的人 - 這真的是他給出的確切答案嗎?

實現一對多連接表的另一個可能原因是它完全將問題/答案與對用戶的依賴區分開來。

例如,假設您添加了Dogs表和Deities表。我們都知道,狗不能註冊爲用戶,因爲他們沒有電子郵件地址,神不會註冊爲用戶,因爲它們在他們之下。也許狗和神仍然會提問,但要做到這一點,你可能需要實施一個狗問題表和一個神明問題表。從理論上講,這仍然是多對多的,但在實踐中你可以這樣做,這樣你就可以有多個一對多的選擇。

相關問題