有一些很好的答案,请允许我推断一下。
正如“dasblinkenlight”所述,检索速度(数据库提前知道两个表之间的关系并可能优化查询),更重要的是,参考/数据完整性。
让我们再谈谈第二个。
考虑一个简单的场景,您有以下三个表(我已对此进行了简化。实际上,您可以订购许多产品,但为了简洁起见,我保持简单):
CustomerTable
ID
FirstName
LastName
OrderTable
ID
CustomerID
ProductID
ProductTable
ID
Description
没有外键,我们可以自由地:
- 创建没有产品的订单
- 创建没有客户的订单
- 删除有订单的客户
- 删除具有产品等的订单...
这是灾难的秘诀
通过使用外键,我们可以重新设计上述内容,因此:
CustomerTable
ID
FirstName
LastName
OrderTable
ID
CustomerID -> References CustomerTable.ID
ProductID -> References ProductTable.ID
ProductTable
ID
Description
我们可以指定 CustomerID 和 ProductID 为“NOT NULL”(就像其他列一样)。这意味着要创建一个订单,我们必须有一个现有的客户和一个现有的产品。优秀的!
但它会变得更好。如果我开始删除产品会怎样?除非我们指定了一些级联选项(参见this),否则数据库将抛出一个不稳定的消息并说“不。你不能删除它,它被某些东西引用了”。
这是等式的数据完整性部分。我们不能指向不存在的东西(外键坚持我们不指向任何东西[如果允许 null],或者存在的东西。主键可以帮助我们解决这个问题)。
突然之间,数据库本身正在确保一切都很好地协同工作并很好地联系起来。没有它,您可以删除所有订单...删除产品...删除您想要的任何内容,然后您的应用程序会想知道到底发生了什么。
使用它们 :)