請你解釋一下爲什麼在創建表時需要指定這些外鍵? 我的意思是,我創建了兩個有一對多關係的表(在ER圖上),但我沒有指定外鍵和引用。我可以使用where子句連接表,甚至執行連接等。爲什麼有必要在數據庫中顯式指定外鍵和引用?
也許,我沒有得到一些基本的概念,雖然我已經閱讀了一些關於它的東西。我想這與數據一致性或參照完整性或某事有關。
那麼,你能解釋我這些概念嗎? 如果我擁有8-10個具有一對多關係的表,並且我可以確保數據正確插入數據庫,那麼這些引用和外鍵是絕對必需的嗎?
請你解釋一下爲什麼在創建表時需要指定這些外鍵? 我的意思是,我創建了兩個有一對多關係的表(在ER圖上),但我沒有指定外鍵和引用。我可以使用where子句連接表,甚至執行連接等。爲什麼有必要在數據庫中顯式指定外鍵和引用?
也許,我沒有得到一些基本的概念,雖然我已經閱讀了一些關於它的東西。我想這與數據一致性或參照完整性或某事有關。
那麼,你能解釋我這些概念嗎? 如果我擁有8-10個具有一對多關係的表,並且我可以確保數據正確插入數據庫,那麼這些引用和外鍵是絕對必需的嗎?
指定外鍵關係不是需要。這只是一個好主意。
當您指定關係時,數據庫確保關係完整性。也就是說,它確保外鍵列中的值是合法值。
此外,在更新或刪除值時,外鍵上的cascade
選項非常有用。
其必要的原因是確保data integrity。
假設您有一個名爲orders
的表和一個名爲order details
的表,它們都有一個名爲order id
的列。
如果您不使用外鍵,您可能會插入訂單表中不存在的訂單的訂單詳細信息。
如果您嘗試將訂單詳細信息添加到不存在的訂單,那麼擁有外鍵將導致數據庫引發錯誤。
如果您刪除已具有詳細信息的訂單,它也會引發錯誤,除非先刪除訂單詳細信息或在外鍵上指定cascade delete。
外鍵約束的驅動程序需要'數據完整性'。 DBMS(數據庫服務器軟件)可幫助您防止在指定外鍵約束時對數據進行意外(無意)修改。這就像你正在幫助DBMS幫助你。因此,例如,如果您指定約束條件,那麼當該產品存在未解決的orders
時,可能會防止意外刪除product
。
您會同意,當您仔細分析約束並在創建數據庫(表)時在SQL中指定它們時,它有助於確保完整性。
當您選擇將「您的實體的知識」保留在數據庫級別本身時,這非常有用。這是一個很好的開始方法,因爲你的表(關係)或多或少是自包含的。另一種方法是在高於數據庫的級別上進行所有這些一致性檢查。例如,這種方法是由MVC框架採用的,如Rails其中模型是應用約束的層,表本身不需要指定外鍵和其他約束。
哪種方法更好取決於你的口味,通常情況下,你應該在精神上使用積木。