数据库设计中主键字段类型的选择

很久都没有写过博客了,从最后一次发表的文章到现在已经是两个多月的时间了,一直都想写点什么,可一直没有时间(其实都是借口),随笔内容无疑就是工作学习中的总结,经验的分享,也是自己成长的一面镜子,好了,言规正传,这次谈谈在数据库设计中主键字段类型的选择。

做web 开发时,经常要与数据库交互,数据库主键的选择也犹为重要,怎么么选择数据库主键字段的类型,主要从以下几个方面考虑:

1. 首先要符合业务需求,这是设计中重要的出发点

2. 数据库的迁移问题,考虑在后期是否要经常迁移,数据库高度唯一性

3.程度中的使用是否更简单,易用(比如分页,一般是根据主键查询来分页的)

4.数据库查询的效率,在主键做为外键链表查询的时候

根据以上的情况,通常数据库主键字段的类型常被设计成 int 或 GUID 或自定义的格式类型,以下详细说明这几种的区别和应用的场合

1. 主键字段类型设置成 int 类型

这种情况主要考虑到程序的分页,排序(按主键字段的递增或递减),简洁易懂,同时可加rowguidcol列,如果是SQL 2005可以使用NewSequentialid()来顺序生成,为同步做准备,数据合并时也可以作为参考。主从表关联速度会快一点。小库推荐。

2.主键字段类型设置成 GUID 类型

这种情况主要考虑到对数据有强烈的唯一性要求,比如用户表的主键类型都被设置成 GUID,其它的表的主键类型也都应该设置成GUID,严格避免数据重复,并易于定位;数据要经常迁移,如果是 int 类型,容易造成混乱;有若干个表饮食类似的数据,有时要对这些数据做合并或其它处理,这时GUID 类型是最好的选择

总结:

使用GUID。不存在重复问题,数据合并时非常简单。关联速度比int慢。经常合并数据或脱机输入数据联机上传最好用此方案。
guid  数值是随机的,而且不接受可以对使用者更具意义的任何形式。没有办法判定产生 guid 值的顺序,所以不适合用于现有依循环次序递增索引键值的应用程序

这两方案根据不同需求选择。

时间: 2024-10-18 02:21:32

数据库设计中主键字段类型的选择的相关文章

数据库设计中主键问题

转自: http://www.jb51.net/article/40933.htm 数据库主键在数据库中占有重要地位.主键的选取策略决定了系统是否可靠.易用.高效.本文探讨了数据库设计过程当中常见的主键选取策略,并剖析了其做主键的优缺点,提出了相应的解决问题的方法 在基于关系型数据库设计时候,通常要为每张表指定一个主键,所谓主键就是能够唯一标识表中某一行记录的属性或属性组,一个表只能有一个主键,但可以有多个候选索引.因为主键可以唯一标识某一行记录,所以可以确保执行数据更新.删除.修改时不出现错误

mysq数据库设计(主键与外键)

主键可以是真实实体的属性,但是常用的好的解决方案是,利用一个与实体信息不相关的属性,作为唯一标示(加个id字段)主键与业务逻辑不发生关系,只用来标示记录 可以在定义完字段后,再定义多列主键(组合主键) 例:primary key(id,name,age);(不是说3个字段都是主键,因为一个表只能有一个主键,可以是3个字段组合成的主键) 设计: 两个实体表内,存在相同的主键字段 如果记录的主键值等于另一个关系表内记录的主键则两天记录对应 1:1对应  数据库设计的时候(常用的信息和不常用的信息分开

数据库表中主键的设置

主键的设置方法有3种: 一种是设置自增长主键,第二种是采用业务主键,第三种是生成唯一序列(使用uuid/guid);如何选择主键设置方式: 1.主键的使用目的: a.为了保证数据查找唯一; b.提高存储效率和索引效率. 2.使用自增主键的场景:      a:表中找不出3个以内字段可以表示的业务主键      b:没有集中大量的插入操作      c:不使用自增id作为外键(即id变化不影响系统逻辑和功能)      此外自增主键的规律很明显,为了不让别人轻易的采集数据,同时符合以上条件,则优先

数据库设计之主键的思考

根据第二范式,主键是必须的.主键还是是唯一的,主键也被作为外键引用建立表和表之间的关系.从这几个方面讨论主键(数据库是Oracle):     1.主键的命名 最近看到由于架构使用hibernate的原因,导致所有主键的命名是ID,我觉得非常糟糕,如部门表(department),用户表(user),角色表(role),这些表如果关联都是id之间关联,非常难辨认这个叫ID是那张表的,如果改为department_id,user_id,role_id是不是很舒服,一看就知道是那张表的ID.可惜架构

数据库表中非主键字段自动加1功能

数据库版本表t_version包含的字段: 用户创建config,在一个config下创建多个版本. 在创建版本时,versionId字段要在该config下上一个版本ID的基础上自动加1. 在创建版本时,使用@Transaction注解设置数据库事务. 获取当前config的最大版本号 此时存在的问题:用户A在获取到当前最大版本后,用户B同时也获取了当前最大版本 值与A相同,A创建版本,B再创建版本.就会存在两个相同的versionId. 思路1: 了解了数据库的隔离级别: 1.Read Un

【数据库】Mysql中主键的几种表设计组合的实际应用效果

写在前面 前前后后忙忙碌碌,度过了新工作的三个月.博客许久未新,似乎对忙碌没有一点点防备.总结下来三个月不断的磨砺自己,努力从独乐乐转变到众乐乐,体会到不一样的是,连办公室的新玩意都能引起莫名的兴趣了,作为一只忙碌的 “猿” 倒不知正常与否. 咳咳, 正题, 今天要写一篇关于mysql的主键.索引的文章,mysql的研究博主进行还不够深入,今天讨论的主题主要是,主键对增删改查的具体影响是什么? 博主将用具体的实验说明. 如果你不了解主键,你可以先看看下面的小节,否则你可以直接跳转到实验步骤 了解

数据库中主键与外键

在关系型数据库中,数据结构有逻辑结构和物理结构.物理结构指存储在物理介质上的数据文件的结构.逻辑结构即关系,也就是一张张的二维表.表中的一列即为一个字段(属性),代表的是实体的一个属性.表中的一行即为一条记录. 如:学生表中(学号,姓名,年龄,性别),在该表中有4个字段,代表学生实体的4个属性.表中的一行数据(001,张三,男,20),即一条记录,表示的是张三这个学生的信息.    在表中,用来唯一标识一条记录的字段集,叫做主关键字或者主关键码,简称主键(主码),而主键包含的属性(字段)叫做主属

数据库设计中一对一、多对一、多对多关系依据外键的实现条件及方法

作者:二歪求知iSk2y链接:https://www.jianshu.com/p/2b27c7ba0653来源:简书 下面以departments和staff_info表为例(为staff_info添加指向departments的外键) 一个表的字段作为外键的条件: 列值必须非空且唯一 测试例子如下: mysql> create table departments (dep_id int(4),dep_name varchar(11)); Query OK, 0 rows affected (0

mybatis中useGeneratedKeys用法--插入数据库后获取主键值

前言:今天无意在mapper文件中看到useGeneratedKeys这个词,好奇就查了下,发现能解决我之前插入有外键表数据时,这个外键获取繁琐的问题,于是学习敲DEMO记录    在项目中经常需要获取到插入数据的主键来保障后续操作,数据库中主键一般我们使用自增或者uuid()的方式自动生成 问题:对于uuid使用Java代码生成的方式还比较容易控制,然而使用数据库生成的主键,这样我们就需要将插入的数据再查询出来得到主键,某些情况下还可能查询到多条情况,这样就比较尴尬了. 那有什么办法来插入数据