数据库主键

数据库的三范式

爱⌒轻易说出口 提交于 2020-01-23 13:40:09
文章来源:微信公众号-Java蚂蚁-数据库三范式是什么? 什么是范式? 简言之就是,数据库设计对数据的存储性能,还有开发人员对数据的操作都有莫大的关系。所以建立科学的,规范的的数据库是需要满足一些规范的来优化数据数据存储方式。在关系型数据库中这些规范就可以称为范式。 什么是三大范式? 第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。 第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依 赖于主键,而不能只依赖于主键的一部分。 第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖 于非主键列 B,非主键列 B 依赖于主键的情况。注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性 如何理解三大范式? 第一范式(1NF): 1)、每一列属性都是不可再分的属性值,确保每一列的原子性 2)、两列的属性相近或相似或一样,尽量合并属性一样的列,确保不产生冗余数据 如果需求说要按哪个省哪个市分类,那么显然第一个表格是不容易满足需求的,也不符合第一范式。 第二范式(2NF): 每一行的数据只能与其中一列相关,即一行数据只做一件事。只要数据列中出现数据重复,就要把表拆分开来。 一个人同时买几件商品,就会出来一个订单号多条数据,这样子客户都是重复的

数据库建表原则大揭秘

£可爱£侵袭症+ 提交于 2020-01-23 03:05:30
数据库设计器 1. 原始单据与实体之间的关系 可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。 〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。 2. 主键与外键 一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。 主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。 3. 基本表的性质 基本表与中间表、临时表不同,因为它具有如下四个特性: (1) 原子性。基本表中的字段是不可再分解的。 (2) 原始性。基本表中的记录是原始数据(基础数据)的记录。 (3) 演绎性。由基本表与代码表中的数据

geoserver暴露mysql表中主键字段

爷,独闯天下 提交于 2020-01-23 00:16:19
  geoserver通过mysql数据源发布图层的时候,默认是不会暴露mysql表的主键或联合主键字段的属性的。   比如我们用leaflet加载geoserver的wms服务的时候,使用idenfity查询图层中指定图元的在数据库中对应记录的属性,发现主键或者联合主键的字段是没有返回的;主键字段一般是id之类的字段,而我们常用的操作就是通过identify获取图层中指定图元的id,然后通过这个唯一id去数据库中查询更多的属性信息进行展示,如果这个id没有返回的话,后面的操作都无法继续进行   那我们如何设置将主键字段的信息暴露出来呢,只要进行如下操作即可: 1,进入数据存储配置页面,选择需要设置的mysql数据源 2,勾选“Expose primary keys”,然后保存即可 勾选后,进入用该数据源发布的的图层设置页面,发现要素类型中已经有主键字段了: 来源: CSDN 作者: huzhenv5 链接: https://blog.csdn.net/huzhenv5/article/details/103744425

Java重置Mysql主键自增长值

喜欢而已 提交于 2020-01-22 17:27:27
MySql 主键自增重置器(统一处理多个表) resetAutoincrement 是一款基于 Java 开发的程序,其功能为重置 mysql 数据库表的主键自增的值为最近的一个。 介绍 开发背景主要是工作中,测试同学在清理数据的时候,使用的是 DELETE 进行删库(其实可以使用 TRUNCATE ),删库完毕后会造成主键自增的值并没有归0,而是继续计算下去(如:数据库新插入一条数据, id 为 483 ,但是我期望的是从 1 开始),作为有点略微强迫症的小开发,我就在思考能否写一个程序来重置 Mysql 的 auto_increment 值,于是乎写了这个 Java 程序。 项目地址 github地址 : https://github.com/chimmhuang/resetAutoincrement 码云地址 : https://gitee.com/chimmhuang/resetAutoincrement 环境说明 JDK : 1.8 MySql : 5.7 程序演示 视频网站 地址 哔哩哔哩 https://www.bilibili.com/video/av84268614 Youtube https://youtu.be/cd724k13Z5I 目录结构 . ├── actuator 该目录下存放执行器接口及其实现类,整个程序的核心实现 ├── config

python后端面试第三部分:数据储存与缓存相关--长期维护

感情迁移 提交于 2020-01-22 15:34:57
################## 数据储存与缓存相关 ####################### mysql数据库, redis数据库, 9. MySQL的索引一般是怎么实现的? B-Tree(一般是B+Tree)和Hash,然后再简单介绍一下。 存储 存储可能包含rdbms,nosql以及缓存等,我以MySQL,redis举例。 mysql相关 mysql 是流行的RDBMS 关系型数据库 1.谈谈mysql字符集和排序规则? 2.var char与char的区别是什么?大小限制?utf8字符集下varchar最多能存多少个字符 char的长度是不可变的,而varchar的长度是可变的,也就是说,定义一个char[10]和varchar[10],如果存进去的是‘csdn’,那么char所占的长度依然为10, 除了字符‘csdn’外,后面跟六个空格,而varchar就立马把长度变为4了,取数据的时候,char类型的要用trim()去掉多余的空格,而varchar是不需要的。 尽管如此,char的存取数度还是要比varchar要快得多,因为其长度固定,方便程序的存储与查找;但是char也为此付出的是空间的代价,因为其长度固定,所以难免会有多余的空格占位符占据空间,可谓是以空间换取时间效率,而varchar是以空间效率为首位的。 再者,char的存储方式是,对英文字符

理解JPA注解@GeneratedValue

佐手、 提交于 2020-01-22 08:11:09
一、JPA通用策略生成器 通过annotation来映射hibernate实体的,基于annotation的hibernate主键标识为@Id, 其生成规则由@GeneratedValue设定的.这里的@id和@GeneratedValue都是JPA的标准用法, JPA提供四种标准用法,由@GeneratedValue的源代码可以明显看出. Target ( { METHOD , FIELD } ) @Retention ( RUNTIME ) public @ interface GeneratedValue { GenerationType strategy ( ) default AUTO ; String generator ( ) default "" ; } 其中GenerationType: public enum GenerationType { TABLE , SEQUENCE , IDENTITY , AUTO } JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO. TABLE:使用一个特定的数据库表格来保存主键。 SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。 IDENTITY:主键由数据库自动生成(主要是自动增长型) AUTO:主键由程序控制。 TABLE比较复杂,这里不讲解。分别介绍其他三个: 1

2014-08-26 遇到的小问题

谁说我不能喝 提交于 2020-01-22 07:50:13
不能快速的保存bug的确是很不爽的事情 ,不仅客户着急 领导也着急 ,自己也着急。。。。。。。。哈哈 原来好好的一个平台 简单的一个插入记录 突然就报错了 错误为 could not insert #9521 原来项目是用 NHibernate 做的插入 抛出的异常 真是无法定位到底是什么错误啊 于是想打开vs调试下远程库 结果调试过程中 无法查询变量的值 在调试即时窗口里 提示 表达式计算器中发生内部错误 郁闷 于是重启vs 又提示 源文件与模块生成时的不同 网上搜了下解决方案 修改 调试 --》 选项 --》 常规里面 去掉 要求源文件与原始版本相匹配 ok 了 调试过程中发现 -- 错误代码抛出的异常 为 直接的 Exception 查看了下 innerException 结果为 "当 IDENTITY_INSERT 设置为 OFF 时,不能向表 'OrderList' 中的标识列插入显式值“ 理论上来说 这个表的主键设置了 自增长,查了下 果然 服务器的表 与 测试的表 不符合 应该是有人改了数据库, 只能是修改下 hbm.xml 文件 ok ,耗时一个半小时 , 时间主要浪费在 vs调试 这上面 ,错误没能够明显的抛出 调试错误后 顺便总结下吧 innerException msdn的地址 http://msdn.microsoft.com/zh-cn/library

MySql数据库优化

…衆ロ難τιáo~ 提交于 2020-01-21 14:05:44
数据库优化,是一种综合性的技术,不是通过某一种方式让数据库效率提高很多,而是通过各个方面的优化,来是数据库效率明显的稳步的提高。 主要包括以下: 1、库表的设计优化(三种范式) 2、 库表添加合适的索引(普通索引+主键索引+唯一索引+全文索引) 3、 分表技术-水平分割与垂直分割 4、 读写分离(add/delete/update与select分开) 5、 多用存储过程和触发器(模块化编程) 6、 优化MqSql配置(配置最大并发数,调整缓存大小,my.ini) 7、SQL优化与慢查询 8、 定时清楚垃圾数据,定时进行碎片整理( MyISAM ) 除此之外,还有 MqSql服务器硬件升级 以下进行详细描述 题外话: 存储引擎: MyISAM : 查询速度快,插入速度快,但不支持 事务 ,碎片多; InnoDB :5.5版本后Mysql的默认数据库,支持事务,支持ACID事务,支持行级锁定; Memory :所有数据置于内存中,拥有极高的插入,适合频繁的数据更新,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失,不需要保存滴; 数据库三种模式结构/三级模式 外模式(用户):用户所能看到的数据视图,可通过数据库操纵语言对数据进行操作; 模式(概念):用户视图的最小并集,所有数据的逻辑结构和概念的描述; 内模式(物理):实际存储组合,内部视图

MySQL两种存储引擎: MyISAM和InnoDB 简单总结

我是研究僧i 提交于 2020-01-21 00:16:47
MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良。虽然性能极佳,但却 有一个缺点:不支持事务处理(transaction) 。不过,在这几年的发展下,MySQL也导入了InnoDB(另一种数据库引擎),以强化参考完整性与并发违规处理机制,后来就逐渐取代MyISAM。 InnoDB,是MySQL的数据库引擎之一,为MySQL AB发布binary的标准之一。InnoDB由Innobase Oy公司所开发,2006年五月时由甲骨文公司并购。与传统的ISAM与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能,类似于PostgreSQL。目前InnoDB采用双轨制授权,一是GPL授权,另一是专有软件授权。 MyISAM和InnoDB两者之间有着明显区别,简单梳理如下: 1) 事务支持 MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。 MyISAM是非事务安全型的,而InnoDB是事务安全型的,默认开启自动提交,宜合并事务,一同提交

JAVA备忘录(三):数据库面试题

放肆的年华 提交于 2020-01-20 19:02:51
一.基本概念 1.超键,候选键,主键,外键是什么 超键:在关系中能够唯一标识一个元组的属性集称为超键。超键可以是一个属性,也可以是多个属性的组合。 候选键:不含多余元素的超键。也就是说,只要删除候选键中的任意一行属性,它就不再能唯一标识一个元组了。 主键:由用户自主选择的能唯一标识一个元组的键,它是超键的一部分。主键的取值不能为空。 外键:在一个关系模式中,存在一个属性,它是其他关系模式的主键,那么称其为当前关系模式的外键。 参考: SQL–超键、候选键、主键、外键的认识和区分 . 2.为什么选择自增列作为主键。 如果选择自增列作为主键,每次插入新纪录时,直接添加在当前记录末尾的后续位置即可,当一个页写满了,就会 开辟一个新的页。 而如果使用非自增列作为主键,比如说像身份证号码,学号这样近似无规则的属性。那么数据块为了维护索引, 会频繁地进行移动原有的数据,分页等操作。一来会增加大量的开销,二来分页操作会导致大量的碎片,使得 索引结构不紧致。 例如在聚集索引中,插入一个随机索引值的数据可能会使数据库为了维护索引而大量地对原有数据进行物理地址的 移动。而在非聚集索索引中,则涉及指针的变动。 3.触发器的作用 触发器是一种特殊的存储过程,主要是通过事件来触发执行的,这些事件包括UPDATE,DELETE,和INSERT操作。 触发器的使用可以强化约束,保证数据库的完整性和一致性