首页 > 编程知识 正文

数据库模型的三要素,分析字段构成并设置主键

时间:2023-05-04 10:00:38 阅读:162799 作者:679

设计数据库时,主要是实体和关系的设计,实体表达的是表,关系表达的是外键。 对于表,它由主键和属性两部分组成。 主键的简单定义是唯一标识表中每行的数据。 实际上,更准确地说,每行数据的唯一标识符是候选关键字(Candidate Key ),一个表可以有多个候选关键字。 主键是候选键之一,主要用于方便数据的查找和管理。 一个表可以指定多个候选键,但只能有一个主键。 由于主键常用于检索数据和表之间的关联,因此主键的设计好坏会严重影响数据操作的性能。 本节介绍了主键设计的一些注意事项。

主键的数据类型最常见的主键数据类型为数字类型、固定长度字符类型和GUID类型。 RDBMS通常在主键上创建聚合索引。 这是SQL Server缺省执行的操作。 由于使用B-Tree的数据结构来存储索引数据,因此主键有以下两个要求:

较短的——在一个Page中存储的节点越多,搜索速度越快。 顺序增加——如果插入的各数据的主键大于前一个主键,则B-Tree上的节点也顺序增加,不会发生频繁的B-Tree分割。 越短越好是为了加快查询的速度,顺序增加是为了加快插入速度。

如果有这两个要求,我们就分析一下各自的数据类型吧。

数字类型:数据量决定使用Int16还是Int32或Int64。 能使用Int32的人不需要使用Int64。 字符类型:几乎不满足以上两个要求。 字符类型一般不短。 它也不是特别推荐的主键类型,因为它很可能不会按顺序增加。 当然,如果您确实希望在业务需要中使用字符类型,请使用char (xx )而不是varchar(xx )。 因为在RDBMS中,固定长度字符串和成为字符串的数据结构和处理不同,varchar的性能更差。 GUID类型:此类型并非所有数据库都有相应的数据类型。 SQL Server上没有uniqueidentifier,MySQL上没有。 GUID类型在SQL Server上为16个字节,并不短。 比4字节的Int32长得多。 插入新数据时,GUID一般采用NewId ()等随机生成GUID的方式生成,因此并不会依次增加,在插入速度方面并不是很快。 通过上面的比较,我们知道使用数字类型是更好的方法,但是为什么有人会用GUID和字符串作为主键呢? 那就是:

与数字型相比,字符型更容易阅读和记忆,在检索相关数据时更方便和直接。

GUID的优点是世界上唯一的。 这意味着,即使在同一个系统中,如果部署了多个环境,内部数据的主键仍然是唯一的,有助于数据整合。 典型的例子是,全国各省各配置一套系统,各省的数据各种输入,避免相互干扰,然后将各省的数据汇总在一起进行总部分析。

数据库主键与业务主键如上所述,表中可能有很多可以唯一识别的候选键,那么这么多的候选键中,应该以哪个为主键呢? 另一种方案是创建新的独立字段作为主键。 此字段没有业务意义,它是用于唯一标识每行数据的自增列或流水号。 这是数据库密钥。 另一种情况是选择其中较短的常用属性作为主键。 这是商业的主键。 我个人建议不要使用有业务意义的字段作为主键,而是使用自我增加的或系统生成的无实际业务意义的字段作为主键。 为什么呢? 主要是出于以下考虑。

具有业务意义的字段很可能是用户从系统输入的,不要信任用户的任何输入如果是用户自己输入的话,记录错误的可能性很大,如果发现输入错误,那时修正主键的话例如,制作人员表时,不要以员工号码和身份证号码为主键。

在现阶段业务上有意义的字段是唯一不变的,但由于公司政策变更、业务调整等原因,不能保证需要修改该业务字段以满足新的业务要求,此时修改主键也很麻烦。 例如,在部门表中,部门代码是主键,但之后部门变更,代码修改后,系统部门表的主键也会变更。

另一个原因是业务的主键在输入数据时不一定清楚。 也可能不知道业务的主键,而输入其他相关信息。 此时,如果将业务的主键用作数据库的主键,则无法输入数据。 例如,如果员工表以员工编号为主键,则在员工尚未入职且没有员工编号时,HR必须首先维护入职前员工的信息。

联合主键联盟主键使用多个字段来唯一标识每行中的数据。 如上所述,主键应该越短越好。 此外,提案是无意义的自我增加列。 这样的话,就不需要联合主键了吗? 答案是否定的。 我们还有可能使用联合主键。 如果联合主键主要用于多对多关系,则中间表必须使用联合主键。 由于简单的多对多关系不需要创建中间关联的实体,因此中间表可能只需要两列,这两列是两个实体表的主键。

生成主键值生成主键值可以作为NHibernate配置的参考。 概要主要有以下几种生成方法。

自增,这是SQL Server常用的主键生成方法,主键的值完全由数据库管理。 一种Sequence对象,是Oracle中常用的生成主键的方法。 SQL Server现在支持此功能。 数据库中主要有Sequence对象

,通过该对象生成主键。GUID,这是用于GUID类型的主键,可以使用newid()这种数据库提供的函数,或者使用程序生成Guid并赋值。Hilo值,这是一种使用高低位算法生成的数字值的主键。该值由NHibernate程序内部生成。其他程序赋值,完全由程序根据自己的算法生成并赋值。

更详细的主键生成,我们可以参见:http://www.cnblogs.com/chenkai/archive/2009/04/13/1434912.html

主键与索引

在概念和作用上,主键与索引是完全两个不同的东西,但是由于我们大部分情况下都是使用主键检索数据,所以大部分数据库的默认实现,在建立主键时会自动建立对应的索引。

以SQL Server为例,默认情况下,建立主键的列,就会建立聚集索引,但是实际上,我们可以在建立主键时不使用聚集索引。另外还有一个唯一约束(索引)的概念,该索引中的数据必须是唯一不能重复的,感觉和主键的意义一样,但是还是有一点点区别。

主键是只能由一个,而唯一约束(索引)在一个表中可以有多个。

主键不能为空,而唯一约束(索引)是可以为空的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。