为什么我们需要表之间的"关系"?

emi*_*ir0 0 sql database ms-access

假设我们有以下2个表格:

CREATE TABLE tblProduct
(`Product_ID` int, `Product_Name` varchar(7));
Run Code Online (Sandbox Code Playgroud)

CREATE TABLE tblProductExtended
(`Product_ID` int, `Product_Size` int, `Product_Quantity` int);
Run Code Online (Sandbox Code Playgroud)

有了这些价值观:

INSERT INTO tblProduct
    (`Product_ID`, `Product_Name`)
VALUES
    (1, 'Shoes1'),
    (2, 'Shoes2');
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

现在很明显,tblProductExpanded中的Product_ID应该是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
Run Code Online (Sandbox Code Playgroud)

哪个回报:

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
Run Code Online (Sandbox Code Playgroud)

那么有人可以向我解释一下,如果我们可以查询相同的信息而不管关系(AFAIK),为什么我们需要"关系"?除了必须花时间设置它们之外,它们的实际用途是什么.

Rya*_*Mes 5

我认为主要原因是数据完整性.如果两个表之间有关系invoice and invoice_item.您将无法添加与发票无关的发票项目.这就是你想要的!

它被称为参照完整性.如果您没有外键,它可能会在您的数据库中变得非常混乱,因为您可以轻松地删除和损坏您的数据.

例如,您可以删除发票而不是相应的发票项目.这被认为是不好的.

我认为这会让你有所作为.

  • 正如@ Ryan-NealMes所说,保护各级数据完整性是一个好主意,这与我们关注安全性的方式非常相似.如果一个区域出现故障,多级有助于提供备份 从数据库开始(毕竟,数据存在于哪里)是合乎逻辑的第一步 (2认同)