数据库基础--基础知识

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36632174/article/details/102460554

概念

数据库,就是存储电子数据的地方,能对数据进行各种操作。

库设计

1.数据库名称要明确,可以加前缀或后缀的方式,使其看起来有业务含义,比如数据库名称可以为Business_DB(业务数据库)。
2.不建议过多使用存储过程,存储过程在不同的数据库中,支持方式不一样,会对数据库服务器压力较大。

表设计

1.数据尽量不要物理删除,应该加一个标志位,以防用户后悔时,能够恢复。物理删除也能够数据回滚,但是前提是不能自动提交数据。
(如果是delete可以,如果是truncate不可以 )
2.数据是否有效的标示字段,其作用为:例如某条记录只有经过某个流程或者被某个人员审核通过后才有用,在这之前一直没有用。
3.排序字段,按照某种类型来排序(sortcode)最好不依赖id排序,这样方便我们查询记录时按照某种方式排序,而不依赖id。
4.增加备注字段,虽然我们考虑了很多用户需要输入信息的需求,但是无论何时我们都不可能考虑全,因此可以定义一个备注字段,
允许用户将其它的信息填写在这里。无论表设计的再神奇,那么还是加一个备注字段。
5.将记录创建人Id和记录创建人名字做为字段(如果只使用名字,那么人多了免不了名字重复,只使用id当然没有问题,
但是我们查询时为了知道创建者的人名需要关联查询另外一张表,性能上不好,而且数据库看起来不是那么一目了然。
并且创建人的名字也不是经常修改的。)
6.添加数据的增添时间和修改时间
7.修改人id和名字,其作用就是标记谁对记录做了修改
8.最后修改人,最后修改时间
9.记录所属公司id和所属部门的id,方便查询只属于某个公司或部门的记录
10.主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。
例:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

基础概念

1.主键是能确定一条记录的唯一标识,比如,一条记录包括身份正号,姓名,年龄。    
身份证号是唯一能确定你这个人的,其他都可能有重复,所以,身份证号是主键。
2.外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。    
比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。    
一个表的外键是另一个表的主键
3.主表在数据库中建立的表格即Table,其中存在主键(primary key)用于与其它表相关联,    
并且作为在主表中的唯一性标识。
4.从表以主表的主键(primary key)值为外键 (Foreign Key)的表,可以通过外键与主    
表进行关联查询。从表与主表通过外键进行关联查询。    
5.关联表两个数据库及其(数据)表之间的数据的相互依赖和影响关系。    
比如现有某学校三个数据表:学生(学号,姓名),课程(课程名,课程编号),选课(学号,课程 号,成绩)。    
选课表中的“学号”,“课程号”必须是另外两个表中存在的数据,才有意义;而且一旦另外两表中的某一学生或课程被删除,    
选课表中的相应学号或 课程号必须自动删除。这就是一种关联关系。它实际上是保证数据完整性的一种做法.
6.父表,子表    
子表其实就是参考表,拥有外键,父表其实是被参考的表,该表主键被引用。    
7.中间表    
存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。    
8.临时表    
存放临时记录,为个人所用。    
9.基表    
数据库中永久存储的表,并且基表就是实际存在的表,它是实际存储数据的逻辑表示。    
10.基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。        
11.数据记录表(履历表)    
索引,该字段没有重复值,但可以有一个空值。提高查询排序的速度,一个表可以有多个惟一索引。

数据库"三少原则"

1.一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了重复的多余的实体,形
成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;
2.一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,
所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;
3.一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复。

数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。

提高数据库系统的运行效率

1.在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。
2.当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,
以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。
3.发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,
以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,
例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。
4.对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。
5.在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。

数据库设计三范式

1.数据表中每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性
如果每列都是不可再分的最小数据单元(也成为最小原子单元),则满足第一范式(1NF)
2.满足1NF后,要求表中所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,而且一个表只描述一件事。
3.必须先满足2NF,要求:表中的每一列只与主键直接相关,而不是间接相关(表中每一列只能依赖于主键)。

数据事务处理方式(基于spring)

1.事务概述:        
事务Transaction,它是一些列严密操作动作,要么都操作完成,要么都回滚撤销。Spring事务管理基于底层数据库本身的        
事务处理机制。        
2.事务四个特性:事务具备ACID四个特点        
①原子性(Atomicity)        
事务最基本的操作单元,要么全部成功,要么全部失败,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚        
到事务开始前的状态,就像这个事务从来没有执行过一样。        
②一致性(Consistency)        
事务的一致性指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。如果事务成功地完成,那么系统中所有        
变化将正确地应用,系统处于有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。        
③隔离性(Isolation)        
指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改        
必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要        
么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。        
④持久性(Durability)        
指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库        
还能恢复到事务成功结束时的状态。        
3.事务的传播特性        
事务传播行为就是多个事务方法调用时,如何定义方法间事务的传播。Spring定义了7中传播行为:        
①propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是Spring        
默认的选择。------------>        
②propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。------>        
③propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。        
④propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。        
⑤propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。        
⑥propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。        
⑦propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required        
类似的操作。        
增删改和查询组合时候需要事务,增删改之间需要事务,查询之间不需要事务。        
4.事务的隔离级别        
①read uncommited:是最低的事务隔离级别,它允许另外一个事务可以看到这个事务未提交的数据。        
②read commited:保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。        
③repeatable read:这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻象读。它除了保证一个事务不能被另外一个事务读取未提交的数据之外还避免了不可重复读情况产生。        
④这是花费最高代价但最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读。        
⑤脏读、不可重复读、幻象读概念说明:        
    a.脏读:指当一个事务正字访问数据,并且对数据进行了修改,而这种数据还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据还没有提交那么另外一个事务读取到的这个数据我们称之为脏数据。依据脏数据所做的操作肯能是不正确的。    
    b.不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有执行结束,另外一个事务也访问该同一数据,那么在第一个事务中的两次读取数据之间,由于第二个事务的修改,第一个事务两次读到的数据可能是不一样的,这样就发生了在一个事物内两次连续读到的数据是不一样的,这种情况被称为是不可重复读。    
    c.幻象读:一个事务先后读取一个范围的记录,但两次读取的纪录数不同,我们称之为幻象读(两次执行同一条select 语句会出现不同的结果,第二次读会增加一数据行,并没有说这两次执行是在同一个事务中)例如:事务T1读取一条指定的WHERE子句所返回的结果集。然后事务T2新插入一行记录,这行记录恰好可以满足T1所使用的查询条件中的WHERE 子句的条件。然后T1又使用相同的查询再次对表进行检索,但是此时却看到了事务T2刚才插入的新行。这个新行就称为“幻像”,因为对T1来说这一行就像突然出现的一样。    
5.事务几种实现方式        
1.编程式事务管理对基于POJO的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()        
等事务管理相关的方法,这就是编程式事务管理。        
2.基于 TransactionProxyFactoryBean的声明式事务管理        
3.基于 @Transactional 的声明式事务管理        
4.基于Aspectj AOP配置事务        
注意:编程式事务管理基本已经out了,有更轻便的实现方式来完成事务管理,此次234三种事务实现。

猜你喜欢

转载自blog.csdn.net/qq_36632174/article/details/102460554
今日推荐