先说一下属性的定义:

表的每一行对应一个元组,表的每一列对应一个域。由于域可以相同,为了加以区分,必须对每列起一个唯一的名字,称为属性(Attribute)。

再来看看几个键的定义:

超键:在关系模式中,能唯一标识元组的属性集称为超键。
候选键 :如果一个属性集能唯一标识元组,且有不包含多余属性,那么这个属性集称为候选键(候选键是没有多余属性的超键)
主键:关系模式中用户正在使用的候选键称主键(primary key)。一般,如不加说明,键是指主键。
外键:在关系模式R中,如果某属性集是其他模式的候选键,那么该属性集对模式R来说就是外键

主要说一下前三个键的区别:

网上有一个很经典的习题用于说明这三个键的区别:

学号                姓名         性别           年龄         系别           专业
20020612       李辉          男             20            计算机       软件开发
20060613       张明          男             18             计算机      软件开发
20060614       王小玉       女             19             物理         力学
20060615       李淑华       女             17             生物         动物学
20060616       赵静          男             21             化学         食品化学
20060617       赵静          女             20             生物         植物学

a){学号}
b){学号、姓名}
c){年龄、系别}
d){姓名、性别}
e){姓名、专业}

原文有解答,但或许有的人似乎看的不太懂。这里说一下我的理解:

这里的【学号 】              【 姓名】         【性别 】         【 年龄】        【 系别】          【 专业】所对应的每一个列称为一个域,其本身为列的属性,再啰嗦一点的说,比如下面这一列,

学号      
20020612  
20060613  
20060614  
20060615  
20060616  
20060617  

其属性就为【学号】。属性集就是属性的集合,比如:{年龄、系别}

再比如下面这一行:

20020612       李辉          男             20            计算机       软件开发
就称为一条记录或者说是一个元组。

a选项{学号}可以唯一的标识一个元组,比如说我们用20060616就可以知道是性别为男,名字为赵静的人。由于没有多余的属性,所以{学号}既可以称为一个超键,也可以称为一个候选键。

b选项{学号、姓名}也可以唯一的标识一个元组,但是这个集合里的姓名属性是不必要的,也就是多余的,即如果没有【姓名】属性,那么这个集合

{学号、姓名}也可以唯一确定一个元组。由于有多余的属性,所以{学号、姓名}可以称为超键,但是不能称为候选键。

c,d,e选项均可以唯一的标识一个元组,并且其中每一个属性均是必须的,去掉任意一个属性,那么其所在的集合便不能唯一的标识一个元组,所以c,d,e 均可以称为超键,也可以称为候选键。

所以这道题中,应该选b。

主键就是在候选键中任意选一个键。

总结:

候选键可以称之为超键,但超键不一定可以称为候选键。候选键的属性一定不多余,但超键的属性不一定均有用。用集合的关系来说就是候选键隶属于超键,而主键为候选键中的一个元素。

主键、外键、超键、候选键的区别【Written By KillerLegend】的更多相关文章

  1. EF中主表和附表一起提交的话,如果主附表的主键外键已经设定。

    EF中主表和附表一起提交的话,如果主附表的主键外键已经设定,如果新增同时新增主表和附表的记录,那么在EF同时提交时,不需要人为的设定附表的主表的主键值,EF会自动为附表添加外键值.

  2. 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库

    第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1.  学习方法 2.  多涨见识 3.  比自己强的人一起,学习更强:比自己更聪明的人 ...

  3. 关系型数据库——主键&外键的

    一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键  比如   学生表(学号,姓名,性别,班级)  其中每个学 ...

  4. Django笔记&教程 4-3 模型(models)主键外键

    Django 自学笔记兼学习教程第4章第3节--模型(models)主键外键 点击查看教程总目录 参考:https://docs.djangoproject.com/en/2.2/ref/models ...

  5. 使用Guid做主键和int做主键性能比较

    使用Guid做主键和int做主键性能比较 在数据库的设计中我们常常用Guid或int来做主键,根据所学的知识一直感觉int做主键效率要高,但没有做仔细的测试无法 说明道理.碰巧今天在数据库的优化过程中 ...

  6. Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)

    本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...

  7. 发送WIN+SAPCE键,WINDOWS,空格键

    键盘代码部份转自:http://www.cnblogs.com/cpcpc/archive/2011/02/22/2123055.html 由于喜欢用CTRL+空格键切换输入法,在WIN8上有所不习惯 ...

  8. php数组array,知道键名如何提取键值

    如果是知道键值,需要查找键名,直接使用array_search()即可.现在反过来,如何操作?   (1)array_walk_recursive()加自定义函数查找   $arr=array( 'n ...

  9. 安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数

    安卓程序中手机后退键与标题栏后退键是不同的,前者回出发onBackPressed()函数,后者需要重重写temclick函数

随机推荐

  1. LeetCode 58. Length of Last Word

    Given a string s consists of upper/lower-case alphabets and empty space characters ' ', return the l ...

  2. nyoj 106 背包问题

    点击打开链接 背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v ...

  3. Android--使用Notification在通知栏显示消息

    在一个Activity中点击按钮,产生一个通知栏消息通知. package cn.luxh.mynotice; import android.os.Bundle; import android.uti ...

  4. @InitBinder

    类型转换: 请求url:  http://localhost:8080/SSHDemo2/stu/pro?s=zk,19 传入参数 s=zk,19   转换为Student public class ...

  5. windows中 dll 的解读

    背景: dll 可以认为是exe 的分割,分割的好处就是多个exe 可以共用一个dll.所以就有了dll的依赖问题 问题来源: 当我们安装软件时(windows系统下),报出:XX.dll  缺失,或 ...

  6. iOS中常见的设计模式——单例模式\委托模式\观察者模式\MVC模式

    一.单例模式 1. 什么是单例模式? 在iOS应用的生命周期中,某个类只有一个实例. 2. 单例模式解决了什么问题? 想象一下,如果我们要读取文件配置信息,那么每次要读取,我们就要创建一个文件实例,然 ...

  7. 分段播放的flash播放器

    效果: 视频分段好处显而易见,就是节省流量,因为看视频很多时候都不会看完,还有很多时候是跳着看的.还有的时候也许用户暂停视频出去买东西了... 本文不讨论flash rtmp直播流,例子用的是普通的h ...

  8. JS实现电子时钟

          目前有个小项目,在首页头部导航栏里需要一个电子时钟的效果,于是我就采用如下代码实现了一个电子时钟的效果.不过不完美,第一种方式容易导致网页莫名其妙的异常,后来觉得可能是做的操作太多了,然后 ...

  9. 学习记录 java 值类型和引用类型的知识

    1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变 ...

  10. BFPRT(线性查找算法)

    BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线性时间复杂度.该算法的思想与快速排序思想相似,当然,为使得算法 ...