zoukankan      html  css  js  c++  java
  • 主键(PrimaryKey)与外键(ForeignKey)

    主键(Primary)

    主键就是数据行的唯一标识。不会重复的列才能当主键。

    工号 姓名 部门 入职时间
    001 凤姐 员工培训部 2010-07-05
    002 兽兽 公关部 2010-08-02
    003 憨憨 开发部 2009-03-05

    为了能唯一标识一行数据,我们给每位员工设置了一个编号(工号),让这个工号来作为这条数据的主键

    在上表中如果用姓名来作为主键,当然是不行的,因为姓名有可能重复

    一个表可以没有主键,但是会非常难以处理,因此没有特殊理由的表都要设定主键。

    那么,一般情况下,我们应该选用什么来做主键呢?

    主键一般有两种选用策略:业务主键和逻辑主键。

    业务主键是使用有业务意义的字段来做主键,比

    如 身份证号、银行账号等;

    逻辑主键是使用没有任务意义的字段做主键(这是完全给程序看的,业务人员不会看数据)。

    因为很难保证业务主键不会重复、不会变化,比如 身份证号重复,另外如果上述表中,凤姐离职了,工号为001的人变成了张三,这样都会导致错误。

    因此推荐用逻辑主键。

    外键(ForeignKey)

    商品名 价格 生产厂家 厂家地址 厂家电话
    大大香瓜子 5.00 大大食品厂 恰恰大街300号 010-123456
    大大开心果 15.00 大大食品厂 恰恰大街300号 010-123456
    苦咖啡 2 伊利食品厂 内蒙古伊利路1号 400400400
    随变 3 伊利食品厂 内蒙古伊利路1号 400400400
    冰工厂 1 伊利食品厂 内蒙古伊利路1号 400400400

    上表中记录的是几种商品的基本信息以及生产厂家的信息,这样来记录信息,有一个重大的缺点,即数据重复,如果这个超市有很多很多的同种商品,那么就需要将相同的厂家信息重复很多遍,而且,一旦,厂家地址变了,是不是还需要把所有的厂家地址都改了,很显然这样太痛苦了,如果是要存在数据库里面,这都是要占空间的。

    所以我们在设计数据库的时候,注意要把这一张表分成两张表:一张专门来存储厂家信息,如表

    编号 名称 地址 电话
    001 大大食品厂 恰恰大街300号 010-123456
    002 伊利食品厂 内蒙古伊利路1号 400400400

    另一张来存储商品的信息,如表

    商品名 价格 厂家编号
    大大香瓜子 5.00 001
    大大开心果 15.00 001
    苦咖啡 2 002
    随变 3 002
    冰工厂 1 002

    怎么样,这样的话,是不是更清晰了呢。两个表通过厂家编号互相关联,“厂家编号”在厂家信息表里是作为主键存在的,商品信息表通过”厂家编号“与厂家信息表取得关联,这样的话从商品信息表中的”厂家编号“字段就可以很容易地查找到商品对应的商家信息。如此一来,这些数据在数据库里占用的空间就小了很多,而且,在厂家信息产生变更之后,我们只要更新厂家信息表中对应的字段就可以了,不用再一条一条的为每个商品区改商家的信息了。

    上述表中第二个表的”厂家编号“字段是指向第一个表的主键的外键

  • 相关阅读:
    weakself的另一种写法
    SDWebImage的使用说明
    关于AVPlayerItem对象的属性duration返回播放总时长的坑
    Xcode 问题
    循环引用问题
    使用Spring Animation的API创建动画
    iOS触摸事件处理
    OS开发中的事件处理(二)-事件传递,响应者链条
    python实现简单的百度云自动下载
    我眼中的K-近邻算法
  • 原文地址:https://www.cnblogs.com/jessiespur/p/6889494.html
Copyright © 2011-2022 走看看