数据库 为什么需要外键?

ZhouYiYu · 2017年08月18日 · 最后由 ZhouYiYu 回复于 2017年08月18日 · 5056 次阅读

假设下场景,我们为了实现应用的可伸缩性,将产品 Products 和供应商 Vendors 信息分成两个表存储,Products 包括产品的描述和价格, Vendors 包括供应商的名称地址等

现在我想查找所有产品及其供应商的信息,在不建立外键的情况下,也可以实现:

SELECT  * FROM products p,vendors v WHERE p.vend_id=v.vend_id;

那为什么还要创建外键,我记得上课的时候,老师告诉我们通过外键是把两张表链接起来?我对外键这个概念模模糊糊的,希望能得到解答.

你是把一个 column 搞定的事交给两个 column,还觉得一个 column 多余吗

有了外键,可以很方便啊,

<%@products.each do |p|%>
  <%p.vendors.each do |v|%>
    <%= p %>
    <%= v %> 
  <%end%>
<%end%>

这样就可以一一对应了啊,多方便啊,不然你的 sql 语句可能写的不止这一句吧😄

你这样就把简单的问题复杂化了,你需要维护一个额外的 vend_id 字段。

adamshen 回复

就算建立外键也需要的 products 表中创建字段 vend_id,将他指定为外键

ZhouYiYu 回复

你的 vendors.vend_id 就是主键吗?如果是主键,那么你建立的 products.vend_id 直接和另一张表的主键关联,就是外键啊。

adamshen 回复

是的.所以建不建外键,都要维护这个字段嘛

ZhouYiYu 回复

外键从逻辑概念上讲,就是和另一张表的主键建立对应关系的列,所以你建立的本身就是外键没错。

至于你说建不建外键,我觉得你说的是数据库里的外键约束。加了可以防止无效的外键值,或者在某些数据库里,会自动加索引之类。

adamshen 回复

我想我大概明白了,感谢回答

hooopo 回复

是的,我大概明白了,感谢回答

ZhouYiYu 关闭了讨论 08月18日 16:57
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册