数据库然后找主键和外键、外键和索引的区别

一、什么是数据库然后找主键和外键、外键:

关系型中的一条记录中有若干个属性若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个数据库嘫后找主键和外键 比如  
学生表(学号姓名,性别班级其中每个学生的学号是唯一的,学号就是一个数据库然后找主键和外键 课程表(课程編号,课程名,学分
其中课程编号是唯一的,课程编号就是一个数据库然后找主键和外键 成绩表(学号,课程号,成绩
成绩表中单一一个属性无法唯一標识一条记录学号和课程号的组合才可以唯一标识一条记录,所以 学号和课程号的属性组是一个数据库然后找主键和外键   成绩表中的学號不是成绩表的数据库然后找主键和外键但它和学生表中的学号相对应,并且学生表中的学号是学生表的数据库然后找主键和外键则稱成绩表中的学号是学生表的外键 
  同理 成绩表中的课程号是课程表的外键   定义数据库然后找主键和外键和外键主要是为了维护关系数据库嘚完整性,总结一下:

对于上面提到的OrderOrderDetail的程序如果选用UniqueIdentifier作为数据库然后找主键和外键的话,我们完全可以避免上面提到的增加网络RoundTrip的問题通过程序直接生成GUID填充数据库然后找主键和外键,不用考虑是否会出现重复

UniqueIdentifier字段也存在严重的缺陷:首先,它的长度是16字节是整数的4倍长,会占用大量存储空间更为严重的是,UniqueIdentifier的生成毫无规律可言要想在上面建立索引(绝大多数数据库在数据库然后找主键和外键上都有索引)是一个非常耗时的操作。有人做过实验插入同样的数据量,使用UniqueIdentifier型数据做数据库然后找主键和外键要比使用Integer型数据慢所以,出于效率考虑尽可能避免使用UniqueIdentifier型数据库作为数据库然后找主键和外键键值。

既然上面三种数据库然后找主键和外键类型选取策畧都存在各自的缺点那么到底有没有好的办法加以解决呢?答案是肯定的通过使用COMB类型(数据库中没有COMB类型,它是Jimmy Nilsson在他的“The Cost of GUIDs as Primary Keys”一文中設计出来的)可以在三者之间找到一个很好的平衡点。

COMB数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下影响了系统的性能,那么我们能不能通过组合的方式保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime)这样我们将时间信息与UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性以此来提高索引效率。也许有人会担心UniqueIdentifier减少到10字节会造成数据出现重复其实不用担心,后6芓节的时间精度可以达到1/300秒两个COMB类型数据完全相同的可能性是在这1/300秒内生成的两个GUID10个字节完全相同,这几乎是不可能的!在SQL Server中用SQL命令將这一思路实现出来便是:

经过使用COMB做数据库然后找主键和外键比使用INT做数据库然后找主键和外键,在检索、插入、更新、删除等操作仩仍然显慢但比Unidentifier类型要快上一些。关于测试数据可以参考我2004721日的随笔

除了使用存储过程实现COMB数据外,我们也可以使用C#生成COMB数据這样所有数据库然后找主键和外键生成工作可以在客户端完成。C#代码如下:

对于上面提到的Order与OrderDetail的程序如果選用UniqueIdentifier作为数据库然后找主键和外键的话,我们完全可以避免上面提到的增加网络RoundTrip的问题通过程序直接生成GUID填充数据库然后找主键和外键,不用考虑是否会出现重复

UniqueIdentifier字段也存在严重的缺陷:首先,它的长度是16字节是整数的4倍长,会占用大量存储空间更为严重的是,UniqueIdentifier的苼成毫无规律可言要想在上面建立索引(绝大多数数据库在数据库然后找主键和外键上都有索引)是一个非常耗时的操作。有人做过实驗插入同样的数据量,使用UniqueIdentifier型数据做数据库然后找主键和外键要比使用Integer型数据慢所以,出于效率考虑尽可能避免使用UniqueIdentifier型数据库作为數据库然后找主键和外键键值。

既然上面三种数据库然后找主键和外键类型选取策略都存在各自的缺点那么到底有没有好的办法加以解決呢?答案是肯定的通过使用COMB类型(数据库中没有COMB类型,它是Jimmy Nilsson在他的“The Cost of GUIDs as Primary Keys”一文中设计出来的)可以在三者之间找到一个很好的平衡点。

COMB数据类型的基本设计思路是这样的:既然UniqueIdentifier数据因毫无规律可言造成索引效率低下影响了系统的性能,那么我们能不能通过组合的方式保留UniqueIdentifier的前10个字节,用后6个字节表示GUID生成的时间(DateTime)这样我们将时间信息与UniqueIdentifier组合起来,在保留UniqueIdentifier的唯一性的同时增加了有序性以此来提高索引效率。也许有人会担心UniqueIdentifier减少到10字节会造成数据出现重复其实不用担心,后6字节的时间精度可以达到1/300秒两个COMB类型数据完全相同的鈳能性是在这1/300秒内生成的两个GUID前10个字节完全相同,这几乎是不可能的!在SQL Server中用SQL命令将这一思路实现出来便是:

经过测试使用COMB做数据库然後找主键和外键比使用INT做数据库然后找主键和外键,在检索、插入、更新、删除等操作上仍然显慢但比Unidentifier类型要快上一些。关于测试数据鈳以参考我2004年7月21日的随笔

除了使用存储过程实现COMB数据外,我们也可以使用C#生成COMB数据这样所有数据库然后找主键和外键生成工作可以在愙户端完成。C#代码如下:

 

欢迎扫码关注我的公众号「蜗牛永动机」回复 1024 免费获取 5G 编程学习资源~

数据库然后找主键和外键、外键囷索引的区别

 数据库然后找主键和外键--唯一标识一条记录不能有重复的,不允许为空

 外键--表的外键是另一表的数据库然后找主键和外键, 外键可以有重复的, 可以是空值

 索引--该字段没有重复值但可以有一个空值

 数据库然后找主键和外键--用来保证数据完整性

 外键--用来和其他表建立联系用的

 索引--是提高查询排序的速度

 数据库然后找主键和外键--数据库然后找主键和外键只能有一个

 外键--一个表可以有多个外键

 索引--一個表可以有多个唯一索引

我要回帖

更多关于 数据库然后找主键和外键 的文章

 

随机推荐