数据库 为什么需要外键?

ZhouYiYu · August 18, 2017 · Last by ZhouYiYu replied at August 18, 2017 · 6502 hits

假设下场景,我们为了实现应用的可伸缩性,将产品 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 字段。

Reply to adamshen

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

Reply to ZhouYiYu

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

Reply to adamshen

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

Reply to ZhouYiYu

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

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

Reply to adamshen

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

Reply to hooopo

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

ZhouYiYu closed this topic. 18 Aug 16:57
You need to Sign in before reply, if you don't have an account, please Sign up first.