数据库创建过程中,建立了若干个column之后,就需要选择其中的一个column为primary key
本文简单地说明:1.什么是primary key 2.如何选择一个好的primary key
目录
1.情景
现在我们正在数据库中创建一张最常见用户表usertable用来存储用户的账号和密码(当然,密码是不能存明文的,要用一些密码学的hash算法加盐生成一个定长的串存起来,每次做密码校验的时候再对用户输入的密码进行同样的hash运算,比对得到的结果,可以有效预防数据库被黑客攻破带来的严重后果)。
看看这家睿智的公司(2019):
被黑客攻破后,数据库中上亿密码全部公之于众,股价哗哗哗:
还有这个睿智(2012)(改密码,快点的~):
回到正题上:
在 mysql workbench中,我们已经创建了两个column,其中一列用来存账号username,一列用来存密码password
为什么username前面是一把小钥匙呢?
因为我将username设置成了primary key,中文常常翻译为:主键
2.什么是primary key
数据库使用key(中文常译为键)进行sort(排序),查询(search)等基本操作。
key的选择,很重要,没有key,数据库就没法存数据。即使是非关系型数据库,也是key-value的结构。
primary key,听名字primary就知道是各种key中最基础、最重要的。
一张表可以设置若干个主键:
例如在上图中我将三种不同的数据都设置成了主键,当然这是不合理的,假设A和B的女朋友同年同月同日生,而且A和B又恰好选择了他们的女票的生日作为密码,那么密码hash之后的结果就会相同,这时候就违反了主键的性质了:唯一性。
主键就是一行数据的ID,就像你的身份证号,唯一,而且不可修改。就像你可以修改你的密码,但是没有修改账号这种说法,那个叫重新注册。
接下来将删掉test列,并主键改回username一个:
当我们点击PK的时候,也会发现NN也被打上了勾,NN是Not Null的缩写,即对于主键而言,数据库的设计者规定了另一个性质是“非空”,但这个数学的意义上来看,这种规定是不合理的,因为,空集本身也是集合,空集也可以映射到其他对象。而且空也具有唯一性,但是人家这么规定了就这样吧。
总结就是:
主键性质:
1.唯一,能够代表一组数据的唯一性特征
可以有多个:如人的指纹、身份证号等
在关系型数据库中,主键是一行数据的特征值
2.非空,这个设计的确实不合理,但是已经规定了,那就这样
照理来说一个系统也是可以允许一个用户只输入密码不输入用户名进入的(账号为空也是唯一的)
3.选择一个好的primary key
1.能选数字类型优先选数字类型,学过《数字电路》就知道:数值大小的比较是硬件电路可以瞬间完成的,最快
2.如果要选字符串VARCHAR,那么越短越好
(字符串必定需要遍历每一个字符,如果不限制长度,那么查询的耗时肯定和长度成线性关系)
参考:一篇很赞的文章(By Mike Chapple)