2015-04-26 58 views
0

假設我們有以下2個表:爲什麼我們需要表之間的「關係」?

CREATE TABLE tblProduct 
(`Product_ID` int, `Product_Name` varchar(7)); 

CREATE TABLE tblProductExtended 
(`Product_ID` int, `Product_Size` int, `Product_Quantity` int); 

有了這些值:

INSERT INTO tblProduct 
    (`Product_ID`, `Product_Name`) 
VALUES 
    (1, 'Shoes1'), 
    (2, 'Shoes2'); 

而且

INSERT INTO tblProductExtended 
    (`Product_ID`, `Product_size`, `Product_Quantity`) 
VALUES 
    (1, 36, 20), 
    (1, 37, 20), 
    (1, 38, 30), 
    (2, 36, 50), 
    (2, 37, 60), 
    (2, 37, 75); 

現在很明顯,PRODUCT_ID在tblProductExpanded應該是tblProduct的Product_ID的FK。不過,我仍然可以查詢:

SELECT tblProduct.Product_ID, Product_Name, Product_Size, Product_Quantity 
FROM tblProduct 
INNER JOIN tblProductExtended ON tblProduct.Product_id = tblProductExtended.Product_id 

將返回:

Product_ID Product_Name Product_Size Product_Quantity 
1 Shoes1 36 20 
1 Shoes1 37 20 
1 Shoes1 38 30 
2 Shoes2 36 50 
2 Shoes2 37 60 
2 Shoes2 37 75 

所以,有人可以給我解釋一下,爲什麼我們還需要「關係」的說法,如果我們可以查詢同一個信息,無論關係(AFAIK)?除了花時間設置它們之外,它們的實際用途是什麼?

+0

你能詳細說一下嗎?我的意思是用戶本身不能訪問數據庫本身,只有形式(假設我們談論MS Access),並且我們可以指定什麼在表單中的哪個位置顯示出來,就好像它在關係中一樣(例如,在產品ID的組合框中表單中的Product_ID字段出現,因此用戶被迫選擇1而不輸入隨機數)。 – emihir0

+0

除了參照完整性實施之外,在Access中建立關係的另外兩個優點是(1)它記錄了表之間的關係,因此如果運行數據庫文檔管理器,它將顯示在那裏,以及(2)如果您正在創建查詢查詢設計器可以自動建立表之間的連接(並且不需要「猜測」)。 –

+0

對不起@HansUp我會刪除mysql標籤。我純粹談論MS-Access,但爲了更好地形象化情況,我使用了SQL本身。 – emihir0

回答

5

我認爲主要原因是數據完整性。如果你有兩個表invoice and invoice_item之間的關係。您將無法添加與發票無關的發票項目。這就是你想要的!它們被稱爲referential integrity。如果你沒有外鍵,它會在你的數據庫中變得非常混亂,因爲你可以輕鬆地刪除和破壞你的數據。

例如您可以刪除發票,而不是相應的發票項目。這被認爲是不好的。

我認爲這會讓你繼續下去。

+0

我得到那部分,但不能在用戶使用的界面中處理?我的意思是在界面背後的代碼中,所以如果他想刪除一個特定的發票,會彈出一個警告消息,並警告你通過這個操作你也可以刪除相應的發票項目,然後用戶選擇是/否/選擇業務並且如果用戶按下「是」,接口背後的代碼將處理刪除相應的項目。 – emihir0

+1

是的,但這應該是你的第一道防線。您應該始終嘗試在數據源處維護數據的完整性。如果某人登錄到您的數據庫並通過它刪除數據會怎麼樣。這是非常常見的,錯誤修復,修復數據等。您應該編寫防禦性代碼。 –

+2

正如@ Ryan-NealMes所說,保護您的數據在各個層次上的完整性是一個好主意,這很大程度上與我們關心安全性的方式有關。如果某個區域出現故障,多個級別可幫助提供備份從數據庫開始(您的數據畢竟存在)是合乎邏輯的第一步 – nomistic

1

表之間的關係是良好的關係數據庫的一個重要方面。

1)它建立一對邏輯上彼此相關的表之間的連接。

2)它有助於優化表結構並最小化冗餘數據。

3)它是使您能夠同時從多個表中獲取數據的機制。

4)關係也是維護數據庫所需的規範化形式,它是關係數據庫規則的一部分。

5)還有@ Ryan-Neal Mes在上面的回答中說: - 保持關係概念的子部分 - 參照完整性。

定義良好的關係可確保數據庫中的關係級別完整性,從而確保關係本身可靠。只有在仔細和正確地建立每種關係時,才能充分利用關係數據庫提供的諸多優勢。

如果不這樣做(在數據庫中沒有明確定義的關係)意味着您將會遇到來自多個表的數據困難時間,並且當您嘗試在相關表中插入,更新或刪除記錄時肯定會遇到問題。