关于数据库键(Key)的一些理解
超键:如果一个关系(表)中所有属性(列)都由一个属性集合决定,那么这组属性集合称为超键。
显然,由一个关系的所有属性组成的属性集合必然是这个关系的超键。
通俗地讲,超键用来唯一确定一个元组(行,记录)。
候选键:一个可以用来唯一确定一个元组的极小的属性集合,即极小超键。(minimal superkey)
主键:一个关系的所有候选键中选择一个用来唯一确定关系的元组,这个候选键成为主键。
外键:在一个关系中,如果一个属性集合是另一个关系的主键,这个属性集合称为外键。
下面说说我的理解。
- 键
键(Key)的含义很重要,却往往被人忽视。数据库用来记录事实,并且提供物理独立性,用户不需要关心数据在磁盘中如何存储,只需要知道数据保存在哪个表中的哪些列里。
在设计数据库时,通常先对需要记录的事实进行数据建模,抽象出实体,关系。每个实体总要有个方法去识别它,不然你就无法从数据库中查询你想要的数据。键(Key)就是用来识别实体的。换句话说,键可以用来确定表中具体的一行记录。
举个简单的例子,假设有一个表Person(FirstName, LastName, BirthTime, Gender),这张表用来记录关于人的数据(姓名,出生时间,性别)。
在日常生活中,我们用姓名来标识一个人。但有时候不同的人叫相同的名字,这时单纯用姓名就无法唯一确定一个人了。我们往往通过附加其他信息来确定这个人,比如出生时间,父母,城市,等等。
- 超键
一组属性(或列)(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。
- 候选键
从super key 中去掉一些属性,剩下的属性有可能是super key,也有可能不是。
如果从一个super key中的属性中,去掉任何一个属性,都不能唯一确定一个实体,那么这个super key就是candidate key。
要描述一个人,我们不需要把所有关于这个人的信息都说出来,那样没有必要。我们也不能只说这个人姓什么,因为这样还不够,听的人不知道是谁。
所以,我们要做的是,用最少的事实描述一个人。这就是 candidate key存在的意义。
- 主键
描述一个东西可以用不同的属性组合.。一个人可以用姓名+出生时间指定,也可以用身份证号码(假设每个人都有身份证号)。因此,一个实体的candidate key也可能有多个。 那我们用哪个来描述一个实体呢?
都可以,所以叫 candidate (候选的) key。当然,候选也意味着有些被选上,有些被淘汰。在数据库中,有一种方法描述实体就够了,因此,要从候选键中选一个作为主键(Primary Key)。
有了主键,就可以用它描述实体。
- 外键
每个表都应该有一个主键,用来唯一确定一行数据。
数据库中,不同的东西保存在不同的表中,有些表之间是互相关联的。假设有个表用来保存公司的员工,一个员工同时也是一个人,这个人的基本信息保存在另一个表Person中,这就需要引用别的实体。
前面说过,主键就是起这个作用的,可以用来标识一个实体。当一个表的主键被一个表引用,它在那个表中就成为外键(foreign key)。
注意:
上面所举的例子只是起说明概念的作用,实际上人的主键不好确定。
a) 也许有两个人同名同姓同时出生,怎么办?
b) 即使没有同名同姓同时出生的人,用许多属性(甚至所有的关于一个实体的属性)来用描述一个人,很不经济。
c) 有些人没有身份证。
一个解决办法是,给每个人一个唯一的数值或名字,专门用来标识一个人,就像学生的学号。这样生成的键角人工键,替代键, 等等(artificial key, surrogate key).
有些人在设计数据库时,每个表都用surrogate,以防万一。实际上这是错误的,愚蠢的。原因有很多,很明显的原因是:他们不是真正意义上的主键。它们没有实际意义,用它们无法标识实体,无法避免重复,只能用过数据库之外的方法(如应用程序)来避免重复)。
若想了解关系代数,可以参照这篇博客:https://blog.csdn.net/zsi386/article/details/79091307
关于数据库键(Key)的一些理解相关推荐
- 数据库键(key)、主键(primaryKey)、索引(index)、唯一索引(uniqueIndex)区别
1.键:key,数据库的物理结构,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的).包括:primary key, unique key, foreign key(主键/唯一键 ...
- mysql数据库如何添加外键约束_MySQL数据库之外键约束的简单理解
定义 如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键.由此可见,外键表示了两个关系之间的相关联系.以另一个关系的外键作主关键字的表被称为主表,具有此外键的表被称为主表的 ...
- 关于mysql数据库回表的粗浅理解
1关于mysql数据库回表 说一下现象 比如有有一张test表,设置id为主键,name为索引 当使用 select id,name,age from test where id=1 查询数据的时候, ...
- mysql三大范式 答案_数据库三大范式定义与理解
数据库三大范式定义与理解 发布时间:2018-06-04 10:24, 浏览次数:291 一.第一范式(1NF) 要求: 要求:每一个分量必须是不可分的数据项. 特点: 1)有主键,且主键不能为空. ...
- Redis 键(key) 命令
Redis 键(key) 命令 命令 描述 Redis DEL 命令 该命令用于在 key 存在是删除 key. Redis Dump 命令 序列化给定 key ,并返回被序列化的值. Redis E ...
- Redis命令——键(key)
Redis 键(key) Redis 键命令用于管理 redis 的键. 语法 Redis 键命令的基本语法如下: redis 127.0.0.1:6379> COMMAND KEY_NAME ...
- Redis 学习---(6)Redis 键(key)
Redis 键(key) Redis 键命令用于管理 redis 的键. 语法 Redis 键命令的基本语法如下: redis 127.0.0.1:6379> COMMAND KEY_NAME ...
- Python操作Redis:键(Key)
Python操作Redis:键(Key) Python的redis模块管理键(Key)方法主要实现的Redis命令包括KEYS.GET.DEL(delete).EXISTS.RANDOMKEY,TYP ...
- 5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)...
5.如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a = sample("ABCDEF",randi ...
- php判断数组中的键是否是某个字符串,php判断数组中是否存在指定键(key)的方法...
搜索热词 本文实例讲述了PHP判断数组中是否存在指定键(key)的方法.分享给大家供大家参考.具体分析如下: PHP中有两个函数用来判断数组中是否包含指定的键,分别是array_key_exists和 ...
最新文章
- 谷歌新发布的分布式数据库服务,是要打破CAP定理了吗?
- 基于ECS部署LAMP环境实验记录
- Java学习_day007:数组与方法
- extern 关键字用法
- 计算机网络基础与信息安全,大学计算机基础计算机网络基础与信息安全计算机网络概述教案.doc...
- Shell - 文件运算符
- .Net Core3.0 日志 logging
- java通过commons-fileupload实现多张图片的上传(servlet)
- LeetCode 1166. 设计文件系统(哈希map)
- Python笔记-windows平台中Flask打包成exe
- js版俄罗斯方块(二)
- kafka--Struct Streaming--kafka案例
- 用matlab如何画六边形,matlab怎样直接画出六边形
- php新年倒计时源码,2020新年倒计时网页HTML源代码 | 一叶轻舟
- AutoRunner 功能自动化测试项目实训之认识自动化测试工具AutoRunner(二)
- java枚举后面括号是什么意思_[Java] Java自定义枚举常量后括号的作用
- 环信java_java环信服务端注册IM代码
- 手机上可以拍一寸证件照吗
- x265-1.8版本-common/wavefront.h注释
- 漫画 | 芯片战争50年,Intel为什么干不掉AMD?
热门文章
- (11)3DMAX之多边形建模的基本认识、多边形修改器和转换为多边形的区别、认识编辑多边形子层级、编辑多边形功能命令快捷方式
- CVPR2022 | 无需对齐就能胜任大运动超分的内存增强非局部注意方法
- 如何选择一款好的护眼台灯?2022护眼用这样的台灯比较好
- [carla入门教程]-5 使用ROS与carla通信
- layui中如果button按钮在form表单外面如何提交
- androidstudio图片居中_android imageview图片居中技巧应用
- BIGEMAP教程之Arcg​is进行DEM数据进行水文分析(二)
- 为什么Flutter已成为2020年开发移动应用程序的最佳选择?
- Python Matplotlib 画心形曲线
- 微信小程序开发中30个常见问题解决方案