2015-05-17 36 views
3

請你解釋一下爲什麼在創建表時需要指定這些外鍵? 我的意思是,我創建了兩個有一對多關係的表(在ER圖上),但我沒有指定外鍵和引用。我可以使用where子句連接表,甚至執行連接等。爲什麼有必要在數據庫中顯式指定外鍵和引用?

也許,我沒有得到一些基本的概念,雖然我已經閱讀了一些關於它的東西。我想這與數據一致性或參照完整性或某事有關。

那麼,你能解釋我這些概念嗎? 如果我擁有8-10個具有一對多關係的表,並且我可以確保數據正確插入數據庫,那麼這些引用和外鍵是絕對必需的嗎?

回答

3

指定外鍵關係不是需要。這只是一個好主意。

當您指定關係時,數據庫確保關係完整性。也就是說,它確保外鍵列中的值是合法值。

此外,在更新或刪除值時,外鍵上的cascade選項非常有用。

1

其必要的原因是確保data integrity
假設您有一個名爲orders的表和一個名爲order details的表,它們都有一個名爲order id的列。
如果您不使用外鍵,您可能會插入訂單表中不存在的訂單的訂單詳細信息。
如果您嘗試將訂單詳細信息添加到不存在的訂單,那麼擁有外鍵將導致數據庫引發錯誤。
如果您刪除已具有詳細信息的訂單,它也會引發錯誤,除非先刪除訂單詳細信息或在外鍵上指定cascade delete

1

外鍵約束的驅動程序需要'數據完整性'。 DBMS(數據庫服務器軟件)可幫助您防止在指定外鍵約束時對數據進行意外(無意)修改。這就像你正在幫助DBMS幫助你。因此,例如,如果您指定約束條件,那麼當該產品存在未解決的orders時,可能會防止意外刪除product

您會同意,當您仔細分析約束並在創建數據庫(表)時在SQL中指定它們時,它有助於確保完整性。

當您選擇將「您的實體的知識」保留在數據庫級別本身時,這非常有用。這是一個很好的開始方法,因爲你的表(關係)或多或少是自包含的。另一種方法是在高於數據庫的級別上進行所有這些一致性檢查。例如,這種方法是由MVC框架採用的,如Rails其中模型是應用約束的層,表本身不需要指定外鍵和其他約束。

哪種方法更好取決於你的口味,通常情況下,你應該在精神上使用積木。

相關問題