超键:如果一个关系(表)中所有属性(列)都由一个属性集合决定,那么这组属性集合称为超键。
显然,由一个关系的所有属性组成的属性集合必然是这个关系的超键。
通俗地讲,超键用来唯一确定一个元组(行,记录)。

候选键:一个可以用来唯一确定一个元组的极小的属性集合,即极小超键。(minimal superkey)

主键:一个关系的所有候选键中选择一个用来唯一确定关系的元组,这个候选键成为主键。

外键:在一个关系中,如果一个属性集合是另一个关系的主键,这个属性集合称为外键。


下面说说我的理解。

键(Key)的含义很重要,却往往被人忽视。数据库用来记录事实,并且提供物理独立性,用户不需要关心数据在磁盘中如何存储,只需要知道数据保存在哪个表中的哪些列里。
在设计数据库时,通常先对需要记录的事实进行数据建模,抽象出实体,关系。每个实体总要有个方法去识别它,不然你就无法从数据库中查询你想要的数据。键(Key)就是用来识别实体的。换句话说,键可以用来确定表中具体的一行记录。

举个简单的例子,假设有一个表Person(FirstName, LastName, BirthTime, Gender),这张表用来记录关于人的数据(姓名,出生时间,性别)。
在日常生活中,我们用姓名来标识一个人。但有时候不同的人叫相同的名字,这时单纯用姓名就无法唯一确定一个人了。我们往往通过附加其他信息来确定这个人,比如出生时间,父母,城市,等等。

  1. 超键

一组属性(或列)(A1, A2, …, An) 可以成为某个实体E的 super key, 如果通过这些属性可以确定一个实体。
如果同样的姓名和出生时间可以标识一个人,那么(FirstName, LastName, BirthTime)就是Person的一个超键。
当然,(FirstName, LastName, BirthTime)加上Gender,即 (FirstName, LastName, BirthTime, Gender)也是一个super key。
但(FirstName, LastName)不是super key,因为有同名同姓的人。如果没有同名同姓的人,那(FirstName, LastName)也是super key。

  1. 候选键

从super key 中去掉一些属性,剩下的属性有可能是super key,也有可能不是。

如果从一个super key中的属性中,去掉任何一个属性,都不能唯一确定一个实体,那么这个super key就是candidate key。
要描述一个人,我们不需要把所有关于这个人的信息都说出来,那样没有必要。我们也不能只说这个人姓什么,因为这样还不够,听的人不知道是谁。
所以,我们要做的是,用最少的事实描述一个人。这就是 candidate key存在的意义。

  1. 主键

描述一个东西可以用不同的属性组合.。一个人可以用姓名+出生时间指定,也可以用身份证号码(假设每个人都有身份证号)。因此,一个实体的candidate key也可能有多个。 那我们用哪个来描述一个实体呢?
都可以,所以叫 candidate (候选的) key。当然,候选也意味着有些被选上,有些被淘汰。在数据库中,有一种方法描述实体就够了,因此,要从候选键中选一个作为主键(Primary Key)。
有了主键,就可以用它描述实体。

  1. 外键

每个表都应该有一个主键,用来唯一确定一行数据。
数据库中,不同的东西保存在不同的表中,有些表之间是互相关联的。假设有个表用来保存公司的员工,一个员工同时也是一个人,这个人的基本信息保存在另一个表Person中,这就需要引用别的实体。
前面说过,主键就是起这个作用的,可以用来标识一个实体。当一个表的主键被一个表引用,它在那个表中就成为外键(foreign key)。

注意
上面所举的例子只是起说明概念的作用,实际上人的主键不好确定。
a) 也许有两个人同名同姓同时出生,怎么办?
b) 即使没有同名同姓同时出生的人,用许多属性(甚至所有的关于一个实体的属性)来用描述一个人,很不经济。
c) 有些人没有身份证。
一个解决办法是,给每个人一个唯一的数值或名字,专门用来标识一个人,就像学生的学号。这样生成的键角人工键,替代键, 等等(artificial key, surrogate key).

有些人在设计数据库时,每个表都用surrogate,以防万一。实际上这是错误的,愚蠢的。原因有很多,很明显的原因是:他们不是真正意义上的主键。它们没有实际意义,用它们无法标识实体,无法避免重复,只能用过数据库之外的方法(如应用程序)来避免重复)。

若想了解关系代数,可以参照这篇博客:https://blog.csdn.net/zsi386/article/details/79091307

关于数据库键(Key)的一些理解相关推荐

  1. 数据库键(key)、主键(primaryKey)、索引(index)、唯一索引(uniqueIndex)区别

    1.键:key,数据库的物理结构,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的).包括:primary key, unique key, foreign key(主键/唯一键 ...

  2. mysql数据库如何添加外键约束_MySQL数据库之外键约束的简单理解

    定义 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的 ...

  3. 关于mysql数据库回表的粗浅理解

    1关于mysql数据库回表 说一下现象 比如有有一张test表,设置id为主键,name为索引 当使用 select id,name,age from test where id=1 查询数据的时候, ...

  4. mysql三大范式 答案_数据库三大范式定义与理解

    数据库三大范式定义与理解 发布时间:2018-06-04 10:24, 浏览次数:291 一.第一范式(1NF) 要求: 要求:每一个分量必须是不可分的数据项. 特点: 1)有主键,且主键不能为空. ...

  5. Redis 键(key) 命令

    Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...

  6. Redis命令——键(key)

    Redis 键(key) Redis 键命令用于管理 redis 的键. 语法 Redis 键命令的基本语法如下: redis 127.0.0.1:6379> COMMAND KEY_NAME ...

  7. Redis 学习---(6)Redis 键(key)

    Redis 键(key) Redis 键命令用于管理 redis 的键. 语法 Redis 键命令的基本语法如下: redis 127.0.0.1:6379> COMMAND KEY_NAME ...

  8. Python操作Redis:键(Key)

    Python操作Redis:键(Key) Python的redis模块管理键(Key)方法主要实现的Redis命令包括KEYS.GET.DEL(delete).EXISTS.RANDOMKEY,TYP ...

  9. 5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)...

    5.如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a = sample("ABCDEF",randi ...

  10. php判断数组中的键是否是某个字符串,php判断数组中是否存在指定键(key)的方法...

    搜索热词 本文实例讲述了PHP判断数组中是否存在指定键(key)的方法.分享给大家供大家参考.具体分析如下: PHP中有两个函数用来判断数组中是否包含指定的键,分别是array_key_exists和 ...

最新文章

  1. 谷歌新发布的分布式数据库服务,是要打破CAP定理了吗?
  2. 基于ECS部署LAMP环境实验记录
  3. Java学习_day007:数组与方法
  4. extern 关键字用法
  5. 计算机网络基础与信息安全,大学计算机基础计算机网络基础与信息安全计算机网络概述教案.doc...
  6. Shell - 文件运算符
  7. .Net Core3.0 日志 logging
  8. java通过commons-fileupload实现多张图片的上传(servlet)
  9. LeetCode 1166. 设计文件系统(哈希map)
  10. Python笔记-windows平台中Flask打包成exe
  11. js版俄罗斯方块(二)
  12. kafka--Struct Streaming--kafka案例
  13. 用matlab如何画六边形,matlab怎样直接画出六边形
  14. php新年倒计时源码,2020新年倒计时网页HTML源代码 | 一叶轻舟
  15. AutoRunner 功能自动化测试项目实训之认识自动化测试工具AutoRunner(二)
  16. java枚举后面括号是什么意思_[Java] Java自定义枚举常量后括号的作用
  17. 环信java_java环信服务端注册IM代码
  18. 手机上可以拍一寸证件照吗
  19. x265-1.8版本-common/wavefront.h注释
  20. 漫画 | 芯片战争50年,Intel为什么干不掉AMD?

热门文章

  1. (11)3DMAX之多边形建模的基本认识、多边形修改器和转换为多边形的区别、认识编辑多边形子层级、编辑多边形功能命令快捷方式
  2. CVPR2022 | 无需对齐就能胜任大运动超分的内存增强非局部注意方法
  3. 如何选择一款好的护眼台灯?2022护眼用这样的台灯比较好
  4. [carla入门教程]-5 使用ROS与carla通信
  5. layui中如果button按钮在form表单外面如何提交
  6. androidstudio图片居中_android imageview图片居中技巧应用
  7. BIGEMAP教程之Arcg​is进行DEM数据进行水文分析(二)
  8. 为什么Flutter已成为2020年开发移动应用程序的最佳选择?
  9. Python Matplotlib 画心形曲线
  10. 微信小程序开发中30个常见问题解决方案