我正在處理數據庫設計不佳的問題。大多數表格確實有PK,但FK不存在。這使得難以可視化表格之間的關係。這讓我想知道,爲什麼SQL讓我們連接沒有約束的表?如果我打算用EmployeeId加入表B的表B,那麼膝關節反應不應該設置FK嗎?爲什麼我們可以加入非約束?
回答
因爲約束條件是可選。
我同意不使用約束通常是一個壞主意,但總的來說,有一個有有創建一個有效的數據庫設計的約束。
某些應用程序要求不使用任何約束來強制刪除仍具有審計追蹤表(某些報告將加入)的「當前」記錄。
在這種情況下,無法加入會妨礙靈活性和使用數據庫的能力。
這當然拋開許多數據庫是由不知道或關心參照完整性的人(業務或開發人員)創建的事實。
+1感謝Oded,這是有道理的。 – 2011-06-16 19:04:06
@ P.Brian.Mackey - 想想如果您執行這樣的規則,您會失去的靈活性。 – Oded 2011-06-16 19:04:52
在某些情況下,你可能會加入日期等,你不想設置FK或它可能是不可能的。它的決定,如果你想定義FK或不
SQL的哲學是,寫這個查詢的人只需要知道表和列;他們不需要知道任何索引或表格關係。該數據庫應該足夠聰明,以瞭解如何高效地執行查詢。
對於即席查詢,這是非常好的。
由於每次插入記錄時外鍵都會影響性能,因此需要確保約束沒有被違反。在高性能系統中,數據庫通常在開發和QA環境中具有FK,但在生產中不會加速插入。如果執行大量插入操作並且數據庫表很大,則性能差異可能很大。
這只是SQL允許您無限制地加入的衆多原因之一。
您很可能仍然會在生產中使用FK來保護您的數據*。如果你有十億行表格,那麼你需要仔細考慮每個案例的評估情況:但這不是你在開始時要做的。 – gbn 2011-06-16 18:58:47
你可能不直接加入相關的表
- Numbers表格
- 交叉連接
- 表祖父母,繞過父表
- ...
哇!你甚至可以加入沒什麼!
- 1. 爲什麼我可以用外鍵約束自由輸入值
- 2. 我們爲什麼可以在VB
- 3. 爲什麼我不能添加外鍵約束
- 4. 這些約束稱爲什麼?我在哪裏可以找到更多?
- 5. 我們如何添加約束我們shema「compoudjs/jungglingdb」
- 6. 什麼是_UITemporaryLayoutWidth,它爲什麼打破我的約束?
- 7. 爲什麼我們可以將Java接口轉換爲* any *非final類?
- 8. 我怎麼可以設定一個非線性約束與CPLEX的Java
- 9. 我可以有複合約束嗎?
- 10. 爲什麼Django給我這個「違反非空約束」的錯誤?
- 11. 爲什麼類型約束不夠?
- 12. 爲什麼外鍵約束失敗?
- 13. 爲什麼需要這個UNIQUE約束?
- 14. 查看不尊重約束,爲什麼?
- 15. 爲什麼約束不起作用?
- 16. 爲什麼FK約束不MySql中
- 17. scipy - 爲什麼COBYLA不尊重約束?
- 18. 爲什麼我無法在我的視圖上安裝約束?
- 19. 我們可以交叉加入EF嗎?
- 20. 什麼情況我們可以去pragma_exception_init
- 21. UIStackView可以被約束嗎?
- 22. 我可以向CockroachDB列添加NOT NULL約束嗎?
- 23. 一個組合和約束解決問題。我可以使用什麼算法?
- 24. 插入期間唯一約束違規:爲什麼? (Oracle)
- 25. 爲什麼我們需要RBAC許可?
- 26. 是否可以爲多個表添加相同的約束?
- 27. mysql#1215 - 無法添加外鍵約束 - 但爲什麼?
- 28. 爲什麼在創建表格時無法添加約束?
- 29. 爲什麼不能添加這個外鍵約束?
- 30. 爲什麼學說拒絕我的外鍵約束?
一個_killed開發人員的膝反動反應,是的。 – SolarBear 2011-06-16 18:56:40