ID字段不采用数据库自增长的几点理由
一个小程序,最初采用了 SqlServer 数据库,后来为了便于部署,转而采用了 Firebird 嵌入式数据库。在重构代码转到 Firebird 的过程中,对“数据实体的数据表的ID字段是否应该使用自增长字段”这个问题做了一些思考,在此做一些总结。
对于是否应该使用自增长的ID字段的问题,个人的观点是应该根据自己的项目情况考虑,谨慎使用。要“谨慎”是因为这有可能会带来一些意想不到的问题:
- 不利于程序在扩展到对其它类型数据库的支持。因为不同类型的数据库实现自增长的方式不一样,其产生和获取自增长ID值的SQL语法也不同,这给程序的数据访问层的数据库支持的扩展会带来额外的工作量。例如,在 SqlServer 中,自增长(Identity)是列的属性,在插入一行后,可以通过 @@IDENTITY 变量、SCOPE_IDENTITY 和 IDENT_CURRENT 函数获得新分配的ID值(注:这三种方式有区别),SQL语句如:INSERT INTO Table1 (field1, field2) VALUES (v1, v2) SELECT SCOPE_IDENTITY() 。但在 Oracle 中得开发者通过创建“序列”并结合“触发器”实现自增长,其插入后获取ID的语句则完全不同。其它的数据库,如DB2的类似于SqlServer,Firebird 的自增长方式与 Oracle 的类似,但总之没有哪两个数据库的自增长是相同的,实现以及语法都不同。
- 对含有数据库自增长的ID字段加入外键关系的数据表的数据进行直接进行导入导出时会导致关系的丢失。例如有两个表:School {ID, Name}; Student {ID, SchoolID, Name}; 建立外键关系 Student.SchoolID -> School.ID 。那么,当将学校和学生数据同时导入这两个表时就会遇到麻烦,因为 School.ID 的值是新的序列值,不一定可预测,这就会导致 Student 数据中保持的 SchoolID 与对应的School数据在表中的新的ID不一致。
- 便于使用中获取id的值
所以,应根据项目的实际情况是否有可能存在以上问题的场景,如果有,采用数据库自增长字段是得不偿失的,带来的初期便利和稍微的性能提升弥补不了后期增加的额外维护成本。如果项目本身不会有多数据库的支持,不会在自增长的 ID 上建立和维护关系,那么使用自增长还是可以的。
原文地址:https://www.cnblogs.com/haiq/articles/1751778.html
ID字段不采用数据库自增长的几点理由的更多相关文章
- php大力力 [020节]mysql数据库唯一id字段如何设置
2015-08-26 php大力力020.mysql数据库唯一id字段如何设置 不懂 以下有些文章 mysql唯一id 自动生成 uuid mysql 里面可以用uuid()语句来生成一个UUID:s ...
- mysql数据库单表只有一个主键自增id字段,ibatis实现id自增
mysql数据库单表只有一个主键自增id字段,ibatis实现id自增 <insert id="autoid"> insert into user_id ...
- Sql Server数据库自增长字段标识列的插入或更新修改操作办法
写在前面的话:在日常的Sql server开发中,经常会用到Identity类型的标识列作为一个表结构的自增长编号.比如文章编号.记录编号等等.自增长的标识很大程度上方便了数据库程序的开发,但有时候这 ...
- Oracle 实现表中id字段自增长
Oracle 实现表中id字段自增长 最近正在学习Oracle的时候发现Oracle表中的字段不能像mysql中那样可以用auto increment修饰字段从而让id这种主键字段实现自增长. 那Or ...
- Android在API推荐的方式来实现SQLite数据库的增长、删除、变化、检查操作
package com.examp.use_SQLite.dao; import java.util.ArrayList; import java.util.List; import android. ...
- Asp.net Identity 系列之 怎样修改Microsoft.AspNet.Identity.EntityFramework.IdentityUser 的 Id 字段的数据类型
这篇博客我们来学习如何将AspNetUsers 表的Id 字段 的类型由nvarchar(128) 改为Int 并且子增长 1.为什么要修改 如果你运行过 Asp.net mvc 示例项目,你好会发现 ...
- SQLServer数据库自增长标识列的更新修改操作
SQLServer数据库自增长标识列的更新修改操作方法在日常的sql server开发中,经常会用到Identity类型的标识列作为一个表结构的自增长编号.比如文章编号.记录序号等等.自增长的标识列的 ...
- 写一个根据id字段查找记录的缓存函数(javascript)
前不久在参加面试的时候遇到了这样一道题,"写一个根据id字段查找记录的缓存函数,如果之前查过,则直接返回之前查找过的对象,而无须重新查找".当时由于时间较短加上时间比较紧张,考虑并 ...
- Spring Cloud Config采用数据库存储配置内容
在之前的<Spring Cloud构建微服务架构:分布式配置中心>一文中,我们介绍的Spring Cloud Server配置中心采用了Git的方式进行配置信息存储.这一设计巧妙的利用Gi ...
随机推荐
- PCB Redis的安装使用
记录一下Redis的安装与基本使用 一.Redis简介 Redis(REmote DIctionary Server)远程字典服务器,免费开源,是一个高性能的(Key/Value)分布式内存数据库.其 ...
- PostgreSQL完整备份与还原过程
1. 备份10.12.2.100PC机(服务器)上的数据库(仅备份数据库和对应的数据库里面各表的结构): pg_dump -h 10.12.2.100 -U postgres -p 8101 -d t ...
- jira以及jira API简单介绍
最近需要预言:是否可以通过jira API实现用例管理,对jira的应用.API.扩展等进行了一定的了解. Jira介绍: jira是目前比较流行的基于Java架构的管理系统(Atlassian公司支 ...
- Poj 3264 Balanced Lineup RMQ模板
题目链接: Poj 3264 Balanced Lineup 题目描述: 给出一个n个数的序列,有q个查询,每次查询区间[l, r]内的最大值与最小值的绝对值. 解题思路: 很模板的RMQ模板题,在这 ...
- 448 Find All Numbers Disappeared in an Array 找到所有数组中消失的数字
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次.找到所有在 [1, n] 范围之间没有出现在数组中的数字.您能在不使用 ...
- Spring MVC 结合Velocity视图出现中文乱码的解决方案
编码问题一直是个很令人头疼的事,这几天搭了一个Spring MVC+VTL的web框架,发现中文乱码了,这里记录一种解决乱码的方案. 开发环境为eclipse,首先,检查Window->pref ...
- vijos P1412多人背包 DP的前k优解
https://vijos.org/p/1412 把dp设成,dp[i][v][k]表示在前i项中,拥有v这个背包,的第k大解是什么. 那么dp[i][v][1...k]就是在dp[i - 1][v] ...
- Android开发学习——android与服务器端数据交互
1.首先搭建服务器端. 使用MyEclipse开发工具 public class MyServlet extends HttpServlet { @Override protected void do ...
- 工作记录 主要了解EF 列注释DataAnnotations
遇到一个问题,是子类型必须完全转换为父类型,普通的显示转化.隐式转化.Cast.ConvertAll等方法无效,用Newtonsoft.Json转化才解决 var json = JsonConvert ...
- php debug/phpstorm调试
apache+phpstorm调试php代码,修改php.ini配置文件开启调试,没有以下代码加上即可, [XDebug]zend_extension="C:\php\php-7.0.12- ...