精华内容
下载资源
问答
  • 1. 原始单据与实体之间的关系可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一...


    1. 原始单据与实体之间的关系

    可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。

    这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。

    〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。

    2. 主键与外键

    一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。

    主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。

    因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。

    3. 基本表的性质

    基本表与中间表、临时表不同,因为它具有如下四个特性:

    • 原子性。基本表中的字段是不可再分解的。

    • 原始性。基本表中的记录是原始数据(基础数据)的记录。

    • 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。

    • 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。

    理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。

    4. 范式标准

    基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

    〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。

    在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。

    表1 商品表的表结构

    5. 通俗地理解三个范式

    通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):

    • 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

    • 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

    • 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

    没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。

    具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

    6. 要善于识别与正确处理多对多的关系

    若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。

    这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。

    〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。

    为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。

    7. 主键PK的取值方法

    PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

    8. 正确认识数据冗余

    主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

    〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。

    只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

    9. E--R图没有标准答案

    信息系统的E--R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E--R图。

    尽管它没有惟一的标准答案,并不意味着可以随意设计。好的E—R图的标准是:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。

    10. 视图技术在数据库设计中很有用

    与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。

    为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。

    对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完成物理设计之后,立即在基本表上建立第一层视图,这层视图的个数和结构,与基本表的个数和结构是完全相同。并且规定,所有的程序员,一律只准在视图上操作。

    只有数据库管理员,带着多个人员共同掌握的“安全钥匙”,才能直接在基本表上操作。请读者想想:这是为什么?

    11. 中间表、报表和临时表

    中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。

    12. 完整性约束表现在三个方面

    域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通过它定义字段的值城。

    参照完整性:用PK、FK、表级触发器来实现。用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。

    13. 防止数据库设计打补丁的方法是“三少原则”

    1、一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;

    2、一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;

    3、一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促读者学会“列变行”,这样就防止了将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这个方法很简单,有的人就是不习惯、不采纳、不执行。

    数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点,不能孤立某一个原则。

    该原则是相对的,不是绝对的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功能,一百个实体(共一千个属性) 的E--R图,肯定比二百个实体(共二千个属性)的E--R图,要好得多。

    提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库,将应用数据库集成为主题数据库,将主题数据库集成为全局综合数据库。

    集成的程度越高,数据共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E—R图中实体的个数、主键的个数、属性的个数就会越少。

    提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。

    “三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。

    14. 提高数据库运行效率的办法

    在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:

    • 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。

    • 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。

    • 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。

    • 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。

    • 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。

    总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。

    上述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的。对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握。并逐步做到:在应用中发展,在发展中应用。

    (完)

    展开全文
  • 出处:blog.csdn.net/sirfei/article/...在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录...

    286b1ab52eafadff21f6fb3c9b56029f.png

    出处:blog.csdn.net/sirfei/article/details/434994


    1. 原始单据与实体之间的关系

    可以是一对一、一对多、多对多的关系。在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体。在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对应多个实体,或多张原始单证对应一个实体。

    这里的实体可以理解为基本表。明确这种对应关系后,对我们设计录入界面大有好处。

    〖例1〗:一份员工履历资料,在人力资源信息系统中,就对应三个基本表:员工基本情况表、社会关系表、工作简历表。这就是“一张原始单证对应多个实体”的典型例子。

    2. 主键与外键

    一般而言,一个实体不能既无主键又无外键。在E—R 图中, 处于叶子部位的实体, 可以定义主键,也可以不定义主键(因为它无子孙), 但必须要有外键(因为它有父亲)。

    主键与外键的设计,在全局数据库的设计中,占有重要地位。当全局数据库的设计完成以后,有个美国数据库设计专家说:“键,到处都是键,除了键之外,什么也没有”,这就是他的数据库设计经验之谈,也反映了他对信息系统核心(数据模型)的高度抽象思想。

    因为:主键是实体的高度抽象,主键与外键的配对,表示实体之间的连接。

    3. 基本表的性质

    基本表与中间表、临时表不同,因为它具有如下四个特性:

    • 原子性。基本表中的字段是不可再分解的。

    • 原始性。基本表中的记录是原始数据(基础数据)的记录。

    • 演绎性。由基本表与代码表中的数据,可以派生出所有的输出数据。

    • 稳定性。基本表的结构是相对稳定的,表中的记录是要长期保存的。

    理解基本表的性质后,在设计数据库时,就能将基本表与中间表、临时表区分开来。

    4. 范式标准

    基本表及其字段之间的关系, 应尽量满足第三范式。但是,满足第三范式的数据库设计,往往不是最好的设计。为了提高数据库的运行效率,常常需要降低范式标准:适当增加冗余,达到以空间换时间的目的。

    〖例2〗:有一张存放商品的基本表,如表1所示。“金额”这个字段的存在,表明该表的设计不满足第三范式,因为“金额”可以由“单价”乘以“数量”得到,说明“金额”是冗余字段。但是,增加“金额”这个冗余字段,可以提高查询统计的速度,这就是以空间换时间的作法。

    在Rose 2002中,规定列有两种类型:数据列和计算列。“金额”这样的列被称为“计算列”,而“单价”和“数量”这样的列被称为“数据列”。

    90c3d9045a978a9f681370d385e9238e.png

    表1 商品表的表结构

    5. 通俗地理解三个范式

    通俗地理解三个范式,对于数据库设计大有好处。在数据库设计中,为了更好地应用三个范式,就必须通俗地理解三个范式(通俗地理解是够用的理解,并不是最科学最准确的理解):

    • 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;

    • 第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;

    • 第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。

    没有冗余的数据库设计可以做到。但是,没有冗余的数据库未必是最好的数据库,有时为了提高运行效率,就必须降低范式标准,适当保留冗余数据。

    具体做法是:在概念数据模型设计时遵守第三范式,降低范式标准的工作放到物理数据模型设计时考虑。降低范式就是增加字段,允许冗余。

    6. 要善于识别与正确处理多对多的关系

    若两个实体之间存在多对多的关系,则应消除这种关系。消除的办法是,在两者之间增加第三个实体。这样,原来一个多对多的关系,现在变为两个一对多的关系。要将原来两个实体的属性合理地分配到三个实体中去。

    这里的第三个实体,实质上是一个较复杂的关系,它对应一张基本表。一般来讲,数据库设计工具不能识别多对多的关系,但能处理多对多的关系。

    〖例3〗:在“图书馆信息系统”中,“图书”是一个实体,“读者”也是一个实体。这两个实体之间的关系,是一个典型的多对多关系:一本图书在不同时间可以被多个读者借阅,一个读者又可以借多本图书。

    为此,要在二者之间增加第三个实体,该实体取名为“借还书”,它的属性为:借还时间、借还标志(0表示借书,1表示还书),另外,它还应该有两个外键(“图书”的主键,“读者”的主键),使它能与“图书”和“读者”连接。

    7. 主键PK的取值方法

    PK是供程序员使用的表间连接工具,可以是一无物理意义的数字串, 由程序自动加1来实现。也可以是有物理意义的字段名或字段名的组合。不过前者比后者好。当PK是字段名的组合时,建议字段的个数不要太多,多了不但索引占用空间大,而且速度也慢。

    8. 正确认识数据冗余

    主键与外键在多表中的重复出现, 不属于数据冗余,这个概念必须清楚,事实上有许多人还不清楚。非键字段的重复出现, 才是数据冗余!而且是一种低级冗余,即重复性的冗余。高级冗余不是字段的重复出现,而是字段的派生出现。

    〖例4〗:商品中的“单价、数量、金额”三个字段,“金额”就是由“单价”乘以“数量”派生出来的,它就是冗余,而且是一种高级冗余。冗余的目的是为了提高处理速度。

    只有低级冗余才会增加数据的不一致性,因为同一数据,可能从不同时间、地点、角色上多次录入。因此,我们提倡高级冗余(派生性冗余),反对低级冗余(重复性冗余)。

    9. E--R图没有标准答案

    信息系统的E--R图没有标准答案,因为它的设计与画法不是惟一的,只要它覆盖了系统需求的业务范围和功能内容,就是可行的。反之要修改E--R图。

    尽管它没有惟一的标准答案,并不意味着可以随意设计。好的E—R图的标准是:结构清晰、关联简洁、实体个数适中、属性分配合理、没有低级冗余。

    10. 视图技术在数据库设计中很有用

    与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式, 是数据处理的一种方法,是用户数据保密的一种手段。

    为了进行复杂处理、提高运算速度和节省存储空间, 视图的定义深度一般不得超过三层。若三层视图仍不够用, 则应在视图上定义临时表, 在临时表上再定义视图。这样反复交迭定义, 视图的深度就不受限制了。

    对于某些与国家政治、经济、技术、军事和安全利益有关的信息系统,视图的作用更加重要。这些系统的基本表完成物理设计之后,立即在基本表上建立第一层视图,这层视图的个数和结构,与基本表的个数和结构是完全相同。并且规定,所有的程序员,一律只准在视图上操作。

    只有数据库管理员,带着多个人员共同掌握的“安全钥匙”,才能直接在基本表上操作。请读者想想:这是为什么?

    11. 中间表、报表和临时表

    中间表是存放统计数据的表,它是为数据仓库、输出报表或查询结果而设计的,有时它没有主键与外键(数据仓库除外)。临时表是程序员个人设计的,存放临时记录,为个人所用。基表和中间表由DBA维护,临时表由程序员自己用程序自动维护。

    12. 完整性约束表现在三个方面

    域的完整性:用Check来实现约束,在数据库设计工具中,对字段的取值范围进行定义时,有一个Check按钮,通过它定义字段的值城。

    参照完整性:用PK、FK、表级触发器来实现。用户定义完整性:它是一些业务规则,用存储过程和触发器来实现。

    13. 防止数据库设计打补丁的方法是“三少原则”

    1、一个数据库中表的个数越少越好。只有表的个数少了,才能说明系统的E--R图少而精,去掉了重复的多余的实体,形成了对客观世界的高度抽象,进行了系统的数据集成,防止了打补丁式的设计;

    2、一个表中组合主键的字段个数越少越好。因为主键的作用,一是建主键索引,二是做为子表的外键,所以组合主键的字段个数少了,不仅节省了运行时间,而且节省了索引存储空间;

    3、一个表中的字段个数越少越好。只有字段的个数少了,才能说明在系统中不存在数据重复,且很少有数据冗余,更重要的是督促读者学会“列变行”,这样就防止了将子表中的字段拉入到主表中去,在主表中留下许多空余的字段。所谓“列变行”,就是将主表中的一部分内容拉出去,另外单独建一个子表。这个方法很简单,有的人就是不习惯、不采纳、不执行。

    数据库设计的实用原则是:在数据冗余和处理速度之间找到合适的平衡点。“三少”是一个整体概念,综合观点,不能孤立某一个原则。

    该原则是相对的,不是绝对的。“三多”原则肯定是错误的。试想:若覆盖系统同样的功能,一百个实体(共一千个属性) 的E--R图,肯定比二百个实体(共二千个属性)的E--R图,要好得多。

    提倡“三少”原则,是叫读者学会利用数据库设计技术进行系统的数据集成。数据集成的步骤是将文件系统集成为应用数据库,将应用数据库集成为主题数据库,将主题数据库集成为全局综合数据库。

    集成的程度越高,数据共享性就越强,信息孤岛现象就越少,整个企业信息系统的全局E—R图中实体的个数、主键的个数、属性的个数就会越少。

    提倡“三少”原则的目的,是防止读者利用打补丁技术,不断地对数据库进行增删改,使企业数据库变成了随意设计数据库表的“垃圾堆”,或数据库表的“大杂院”,最后造成数据库中的基本表、代码表、中间表、临时表杂乱无章,不计其数,导致企事业单位的信息系统无法维护而瘫痪。

    “三多”原则任何人都可以做到,该原则是“打补丁方法”设计数据库的歪理学说。“三少”原则是少而精的原则,它要求有较高的数据库设计技巧与艺术,不是任何人都能做到的,因为该原则是杜绝用“打补丁方法”设计数据库的理论依据。

    14. 提高数据库运行效率的办法

    在给定的系统硬件和系统软件条件下,提高数据库系统的运行效率的办法是:

    • 在数据库物理设计时,降低范式,增加冗余, 少用触发器, 多用存储过程。

    • 当计算非常复杂、而且记录条数非常巨大时(例如一千万条),复杂计算要先在数据库外面,以文件系统方式用C++语言计算处理完成之后,最后才入库追加到表中去。这是电信计费系统设计的经验。

    • 发现某个表的记录太多,例如超过一千万条,则要对该表进行水平分割。水平分割的做法是,以该表主键PK的某个值为界线,将该表的记录水平分割为两个表。若发现某个表的字段太多,例如超过八十个,则垂直分割该表,将原来的一个表分解为两个表。

    • 对数据库管理系统DBMS进行系统优化,即优化各种系统参数,如缓冲区个数。

    • 在使用面向数据的SQL语言进行程序设计时,尽量采取优化算法。

    总之,要提高数据库的运行效率,必须从数据库系统级优化、数据库设计级优化、程序实现级优化,这三个层次上同时下功夫。

    上述十四个技巧,是许多人在大量的数据库分析与设计实践中,逐步总结出来的。对于这些经验的运用,读者不能生帮硬套,死记硬背,而要消化理解,实事求是,灵活掌握。并逐步做到:在应用中发展,在发展中应用。

    (完)

    长按打开更多惊喜532e7d670273bec09c8e4c95bd4b75b0.png

    0715b443ccfc47659840b7510aec1a2a.png

    展开全文
  • 数据库:事务

    千次阅读 2018-07-31 11:18:42
    事务有哪些性质? 如何实现事务? 如何管理事务? 1. 什么是事务? 事务是一个工作的逻辑单元,这个单元必须是全部运行或者全部取消,不能接受中间状态。在事务中所有的 SQL 语句必须成功完成。如果 SQL 语句中...

    在开始编写文章前,有几个问题需要思考一下:

    • 什么是事务?
    • 事务有哪些性质?
    • 如何实现事务?
    • 如何管理事务?

    1. 什么是事务?

    事务是一个工作的逻辑单元,这个单元必须是全部运行或者全部取消,不能接受中间状态。在事务中所有的 SQL 语句必须成功完成。如果 SQL 语句中的任何一个失败,那么整个事务必须回滚到原始的数据库状态,这个状态也就是该事务开始之前的状态。一个成功事务是将数据库从一个一致性状态修改到另一个一致性状态。在数据库的一致性状态里,所有数据的完整性必须满足。

    2. 事务有哪些性质?

    每个单独的事务必须具有原子性、一致性、排他性和持久性。有时把这些性质称为 ACID。此外,当运行多个事物时,DBMS 必须安排事务同时运行。每个事务的运行调度必须具有可串行性的性质。

    • 原子性要求每个事务的所有操作(SQL 请求)必须是完整的;如果不是,事务撤销。如果事务 T1 有 4 个 SQL 请求,所有这 4 个请求必须成功完成;否则,整个事务撤销。换句话说,事务是被看成单个的、不可分割的逻辑单元。
    • 一致性暗示了数据库的一致性的状态的持久性。事务把数据库从一个一致性状态修改为另一个一致性状态。当事务结束时,数据库必须是一致性状态;如果事务的任何地方违反了完整性约束,整个事务撤销。
    • 排他性意味着在事务运行期间,所用的数据不能被另一个事务使用,直到第一个事务结束。换句话说,如果事务 T1 正在使用数据 X,那么该数据不能被其他事务访问,直到 T1 结束。这个性质用在多用户数据库环境中非常有用,因为多个用户可能同时访问和更新数据库。
    • 持久性确保一个事务的修改已完成(提交),不能不做或者丢失,即使在系统错误发生时也是如此。
    • 可串行性确保事务同时运行的调度产生一致的结果。这个性质在多个用户和分布式数据库中很重要的,其中多个事务可能同时运行。

    由于其本身的性质,单用户数据库系统自动确保可串行性和数据库的排他性,因为仅一个事务在一个时刻被运行时。原子性、一致性和事务的持久性必须由单用户 DBMS 来保证(甚至单用户 DBMS 必须从错误中恢复,这些错误包括中断、断点、不正当的应用运行)。

    多用户数据库通常受多个同时存在的事务支配。因此,多用户 DBMS 必须运用管理手段,以确保可串行性和事务的排他性(还有原子性和持久性),以保证数据库的一致性和完整性,例如,如果多个同时存在的事务运行相同的数据集,并且在第一个事务完成之前,第二个事务更新了数据库。此时,违背了排他性,并且数据库也不一致的。DBMS 必须通过使用并发控制技术来管理事务,以避免这样不符合要求的情况。

    如何实现事务?

    美国国家标准学会制定了标准(ANSI),这个标准管理 SQL 数据库事务。事务支持有两个 SQL 语句提供:COMMIT(提交)和 ROLLBACK(回滚)。ANSI 要求事务顺序最终由用户和应用程序来设定,顺序必须支持所有随后的 SQL 语句,直到如下 4 个事件之一发生:

    • 一个 COMMIT 语句到达,在这种情况下,所有的修改都永久的记录在数据库中,这个 COMMIT 语句自动结束 SQL 语句;
    • 一个 ROLLBACK 语句到达,在这种情况下,所有的修改都取消,并且数据库回滚到以前的一致性状态;
    • 一个程序成功结束,在这种情况下,所有的修改都永久地记录在数据库里。这种情况下等同于 COMMIT;
    • 程序不正当的中断,在这种情况下,所有在数据库上的修改都要取消,并且数据库回滚到以前一致性状态。这种情况和 ROLLBACK 一样。

    事务日记

    DBMS 用事务日记来跟踪所有更新数据库的事务。DBMS 使用存储在日记中的信息来恢复命令,ROLLBACK 语句、程序中不正常中断或者系统错误(比如网路错误或磁盘损坏)都会触发恢复命令。一些 RDBMS 使用事务日记,把数据库恢复到当前的一致性状态。当服务器发生错误时,Oracle 自动回滚到未提交事务,并且回滚前面已提交但未写到物理数据库中的事务。这个行为要求事务的正确性,并且这是任何 DBMS 的典型情况。

    当 DBMS 运行修改数据库的事务时,它总是自动更新事务日记。事务日记存储如下信息:

    1、事务开始记录;

    2、每个事务组件(SQL 语句):

    • 操作运行的类型(UPDATE、DELETE、INSERT)。
    • 事务影响到事件名(表名)。
    • 更新之前的值和之后的值。
    • 同一个事务,指针指向前一个和下一个事务日记。

    3、事务的结束(COMMIT);

    尽管使用事务日记增加 DBMS 的处理开销,但是能够恢复已毁坏的数据库,是物有所值的。

    3. 如何管理事务?

    当两个或两个以上的并发事务同时运行时,可能发生严重的问题。数据库事务包括很多数据库 I/O 操作,这些操作涉及把数据库从一个一致性状态转到另一个一致性状态。如果事务更新了多个表/行,那么数据库总是在事务运行期间,有过暂时的不一致状态(如果事务仅包含一个更新,那么就没有暂时的不一致性状态)。暂时的不一致状态之所以存在,是因为计算机有序地运行操作。在这个有序的过程中,事务的排他性阻止他们访问其他事务还没释放的数据。此时,调度器的工作非常重要,它使用多核处理器,可以在同一时间运行多个操作。如果两个事务同时运行并且它们同时访问同一数据,将会发生什么呢?

    在事务中的操作是随机运行的,只要两个事务 T1 和 T2 访问的是不相关的数据,就不会发生冲突,而且运行的顺序不会影响最后的结果。但是,如果事务要对相关(相同)数据进行操作,冲突可能发生在事务内部以及运行的顺序中,对另一个可能产生不满意的结果。因此,怎么确定的顺序,谁决定这个顺序?值得庆幸的是,DBMS 可以使用内置调度器来处理这种复杂的任务。

    调度器是一种特殊的 DBMS 过程,它在并发事务的运行过程中创建操作的运行顺序。调度器使数据库的操作交替运行,以便保证事务的可串行化和排他性。调度器根据事务在并发控制算法中的行为(如锁或时间戳方法),确定合理的顺序。但是,并不是所有的事务都是可串行化的,理解这一点很重要。DBMS 确定哪些事务是可串行化和交替运行的。通常,DBMS 根据先来先服务的原则,先运行那些不可串行化的事务。调度器的主要工作是生成一个事务操作的顺序安排。可串行化调度是一种事务操作的调度,在这个调度中,事务交替运行的结果与事务顺序运行的结果相同。

    调度器可以提高计算机的中央处理器和存储系统的效率。如果不安排事务的运行顺序,那么所有事务都按照先进先出服务的原则。这样的问题是,当 CPU 等待一个 READ 或者 WRITE 操作完成时,浪费了处理时间,从而浪费了 CPU 的时间。简而言之,在多用户 DBMS 环境中,先进先服务调度往往产生不可接受的响应时间。因此,需要其他一些调度方法来提高整体系统的效率。此外,为了确保两个事务同时更新同一数据,调度有助于数据的隔离。数据库操作中的 READ 与 WRITE 或者 WRITE 与 WRITE 都可能产生冲突。在并发事务中有几种方法来调度冲突操作的运行。这方法是锁、时间戳、优化等。

    在多用户数据库系统中,多个事务同时运行的协作。并发控制的目的是为了确保在多用户数据库环境中,事务的可串行化。并发控制是很重要的,因为在同一个数据库,事务同时运行会产生数据的完整性和一致性问题。3 个主要的问题是更新丢失、未提交数据和不一致检索。

    • 更新丢失:更新丢失发生在两个并发事务 T1 和 T2 在同时更新同一数据库时,其中一个更新丢失(其他事务重复写)。
    • 未提交数据:未提交数据发生在两个事务 T1 和 T2 同时运行,并且在第二个事务(T2)已经访问未提交数据之后,第一个事务(T1)发生了回滚——因此违反了事务的排他性。
    • 不一致检索:不一致检索发生在事务访问数据之前和其他事务运行完成之后。

    锁保证了当前事务对数据的独立性。换句话说,当事务 T1 正在使用一个数据时,事务 T2 不能访问这个数据。事务在获得对数据访问之前,先获得锁。只有在这个事务完成并释放锁之后,其他事务才可以对这个数据加锁。

    大部分的多用户 DBMS 自动启动和实施锁程序。锁管理器管理所有的锁信息,并且负责分配和监督所有事务使用的锁。

    3.1 锁粒度

    锁粒度表示的锁使用级别。锁可有如下级别决定:数据库级、表级、页级、行级、甚至字段(属性)级。

    1、数据库级

    在数据库级锁中,当事务 T1 在运行时,为了防止事务 T2 使用数据库中的表,锁住整个数据库。锁的级别对成批的处理很好,但是对多用户 DBMS 则是不合理的。试想一下,在新的事务申请数据库之前,如果有成百上千的事务必须等待前面事务完成,那么数据库的访问有多么慢?下图说明数据库级锁。注意,由于是数据库级锁,即使是要访问数据库中的 T1 和 T2 也不能同时访问这个数据库。

    2、表级锁

    在表级锁中,当事务 T1 正在使用表时,为了防止事务 T2 访问该表的任何一行,锁住整个表。如果一个事务需要访问多个表,那么需要锁住每个表。但是只要访问的是不同表,那么两个事务是可以访问同一个数据库的。

    当多个事务等待同一个表时,因为表级锁比数据库级锁限制更少,所以会引起堵塞。当不同的事务需要访问不同的表时,也就是说,当事务不会相互影响时,锁导致延迟,这样的话是很令人厌烦的。因此,表级锁对多用户的 DBMS 不适合。下图说明表级锁的作用。注意,在下图中,即使事务 T1 和事务 T2 使用不同的行,也同时不能访问同一表,T2 必须等 T1 释放表。

    3、页级锁

    在页级锁中,DBMS 将锁住这个磁盘页。磁盘页或者页相当于磁盘块,是直接从磁盘寻址的。页有固定的大小,如 4k、8k、16k。例如仅想把 73 字节写到 4K 的页里,则必须把整个 4K 页从磁盘中读出,然后在内存中更新,最后写会磁盘。一个表中可以存放许多页,一个页中可以包含一个或多个表中的行。下图所示的是一个页级锁例子。注意,当锁住的是不同磁盘页时,事务 T1 和 T2 才可以访问同一表。如果 T2 需要使用 T1 锁住的页中的某些行时,T2 必须等 T1 释放该页。

    4、行级锁

    行级锁比前面讨论的锁的严格性更低。DBMS 允许并发事务访问同一表中的不同行,即使这些行在同一页中也是如此。尽管行级锁提高了数据的可用性,但是它的管理成本却很高,因为数据库表可能含有冲突事务。当应用程序在同一页中需要更多个锁时,现代的 DBMS 会自动地把行级锁提升为页级锁。如下图,即使行请求是在同一页中,两个事务也可以同时运行。如果 T2 和 T1 同时请求同一行,T2 必须等待。

    5、字段级锁

    只要并发事务同时请求的是同一行的不同字段,字段级锁就允许并发事务去访问该行。尽管字段级锁产生更多灵活的多用户数据访问,但是它仅在 DBMS 中运行,因为它将使得计算机的负担极高。

    3.2 锁类型

    锁有各种级别,DBMS 可以使用不同锁类型:二元锁、共享锁/排他锁。

    1、二元锁

    二元锁仅有两种状态:加锁(1)或者解锁(0)。如果一个对象——可能是一个数据库、表、页或行——被一个事务锁住,其他事务不可以使用这个对象。如果一个对象没有加锁,任何事务如果使用它就可以对它进行加锁。每个数据库运行需要对被作用的对象进行加锁。基于这个规则,一个事务在运行结束之后必须解锁。因此,每个事务对要访问的每个数据项进行加锁或解锁。DBMS 自动地管理操作和安排时间,用户不需要关心数据项的加锁和解锁(每个 DBMS 有自己默认的加锁机制,如果终端用户想要覆盖这种默认机制,可以使用 LOCK TABLE 或其他 SQL 命令)。

    2、共享/排他锁

    “共享” 和 “排他” 表示的是锁的性质。当事务访问对象并且要修改时,对象就加排它锁。当冲突可能发生时,必须加排它锁。如果要让并发事务可以读取数据,就加共享锁。只要并发事务只读,共享锁不会产生冲突。

    如果一个事务想从数据库中读数据且这个数据没有排它锁,那么就加共享锁。当一个事务想更新(写)一个数据项且没有其他事务对这个数据项加锁时,那么就加排它锁。使用共享/排他锁思想,锁有 3 个状态:解锁、共享(读)、排他(写)。

    两个事务会发生冲突的条件是,其中至少有一个是 WRITE 事务,因为两个 READ 使用可以安全地同时运行,共享锁允许多个 READ 事务同时读取相同的数据项。例如,如果事务 T1 在数据项 X 上有一个共享锁,而 T2 要读取数据项 X,那么 T2 也可以获得数据项 X 上的共享锁。

    如果 T2 要更新数据项 X,就要求 T2 在数据项 X 上加一个排它锁。当且仅当数据项没有其他锁时,才可以在数据项上加排它锁。因此,如果事务 T1 已经在数据项 X 上加了共享锁或排它锁,事务 T2 就不能在加排它锁了,T2 必须等待,知道 T1 提交完成。这种条件就称为互斥原则:在同一个对象上,不能有多个事务同时施加排它锁。

    尽管共享锁可以使得数据访问更高效,但共享/排他锁模式增加了锁管理器的负担,因为:

    • 在加锁之前,锁的类型必须是已知的。
    • 需要使用 3 个锁操作:READ_LOCK(检查锁的类型)、WRITE_LOCK(加锁)和 UNLOCK(解锁)。
    • 这种模式被提升,以便允许锁的升级(从共享锁到排他锁)和降级(从排它锁到共享锁)。

    3.3 死锁

    尽管锁防止了严重的数据不一致性问题,但是也可以带来下面两个问题:

    • 事务调度可能不是不可串行化的。
    • 调度可能导致死锁。数据库死锁,相当于大城市里的交通堵塞。当两个或两个以上的事务相互等待将导致数据库死锁。

    庆幸的是,上面两个问题都已经解决了:通过加锁协议(如两阶段加锁)来保证可串行化,也可使用死锁检查和保护技术来防止死锁的发生。

    两阶段加锁

    两阶段加锁定义了事务如何获得和解锁。两阶段加锁保证了可串行化,但不能阻止死锁。这两阶段是:

    • 增长阶段:事务获得所有需要的锁,但不能释放任何数据。一旦获得了所有锁,事务就位于加锁点上。
    • 缩减阶段:事务释放所有锁且不可获得任何新锁。

    两阶段加锁协议有如下规则:

    • 同一事务没有冲突的锁。
    • 同一事务中,解锁都是在获得锁之后进行的。
    • 在获得所有锁之前(也就是说,在事务位于加锁点上之前),任何数据都不会发生变化。

    参考

    https://www.souyunku.com/2018/07/30/mysql

    展开全文
  • 1、有哪些网络数据库Mysql(中小型的关系型数据库)Oracle(大型的关系型数据库)SqlServerRedis (非关系型数据库 被用作于分布式的分片分区数据快存快储)MongoDB (非关系型数据库 也常常用做分布式)2、安装mysql现在...

    1、有哪些网络数据库

    Mysql(中小型的关系型数据库)

    Oracle(大型的关系型数据库)

    SqlServer

    Redis (非关系型数据库 被用作于分布式的分片分区数据快存快储)

    MongoDB (非关系型数据库 也常常用做分布式)

    2、安装mysql

    现在一般我们会有数据库的图形操作软件去可视化的操作数据库,在我们学习阶段我们必须回归原始的Windows操作界面去操作数据库

    安装

    ea9b9374324d

    image.png

    ea9b9374324d

    image.png

    ea9b9374324d

    image.png

    ea9b9374324d

    image.png

    ea9b9374324d

    image.png

    ea9b9374324d

    image.png

    输入root

    ea9b9374324d

    image.png

    3、mysql命令

    查看本机有几个数据库

    show databases;

    ea9b9374324d

    image.png

    创建一个数据库

    CREATE DATABASE 数据库名;

    ea9b9374324d

    image.png

    选择使用数据库

    use 数据库名字;

    ea9b9374324d

    image.png

    删除数据库

    drop database 数据库名;

    ea9b9374324d

    image.png

    4、创建数据表

    CREATE TABLE IF NOT EXISTS `runoob_tbl`(

    `runoob_id` INT UNSIGNED AUTO_INCREMENT,

    `runoob_title` VARCHAR(100) NOT NULL,

    `runoob_author` VARCHAR(40) NOT NULL,

    `submission_date` DATE,

    PRIMARY KEY ( `runoob_id` )

    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    CREATE TABLE 数据表名(

    字段名 数据类型 [描述],

    字段名 数据类型(数据长度 可写可不写) [描述]

    PRIMARY KEY ( `主键的字段名` )

    );

    选择数据库

    use td01;

    创建数据表

    CREATE TABLE `rg`(

    `class_id` INT UNSIGNED AUTO_INCREMENT,

    `class_name` VARCHAR(100) NOT NULL,

    PRIMARY KEY ( `class_id` )

    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    查看有哪几张数据表

    show tables;

    ea9b9374324d

    image.png

    查看表结构

    desc 表名;

    ea9b9374324d

    image.png

    5、删除数据表

    DROP TABLE 表名 ;

    6、顺滑的走一遍

    查看数据库

    show databases;

    创建数据库td02

    create database td02;

    选择使用数据库td02;

    use td02;

    创建数据表rq;

    CREATE TABLE `rq`(

    `class_id` INT UNSIGNED AUTO_INCREMENT,

    `class_name` VARCHAR(100) NOT NULL,

    PRIMARY KEY ( `class_id` )

    )ENGINE=InnoDB DEFAULT CHARSET=utf8;

    查看数据表

    show tables;

    查看具体的某张数据表的结构

    desc rq;

    展开全文
  • 数据库迁移实际上就是对数据库库表的结构变化做版本控制,之前对数据库库表结构做修改的方式比较原始,比如说对某张库表新增了一个字段,都是直接在库表中执行alter table xxx add .. 的方式直接修改,但是这么做有些...
  • mybatis是支持普通SQL查询、存储过程和高级映射的优秀持久层框架...使用mybatis的重要一步是配置,要不怎么知道使用哪一个数据库有哪些mapper文件,主配置文件 mybatis-config.xml: jdbc_mysql.properties文件: XML
  • 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 ... 先来了解下常用的数据库有哪些: 常用的企业数据库系统包括:Oracle SQL Server Sybase Informix DB2 常用的中小型数据库系统包括:PostgreSQ
  • 数据库本身,查看数据库缓存状态 数据库应用程序接口(ODBC、JDBC......) 原文出处:Netkiller 系列 手札 本文作者:陈景峯 转载请与作者联系,同时请务必标明文章原始出处和作者信息及本声明。 ...
  • 我们可能遇到:数据库中保存正确,但从数据库中读取出来的是乱码写入的...数据库相关的字符集设置首先我们要了解,与数据库交互的环节,有哪些地方是可以设置字符集的:表的每个字段可以单独设置字符集每张表可以...
  • 数据交换平台负责从各个业务系统采集数据,对数据进行清洗与整合,按照数据中心建设标准规范化原始数据,最终形成业务核心数据库,并提供给其它应用系统使用。本文中琛魔方将重点介绍数据交换平台的功能结构设计与...
  • * 现如今,大数据越来越流行了,可以说现在无论是什么公司,都积累了大量的原始数据,数据的作用想必大家都是比较清楚的,而在这个信息对称的时代,数据分析师的...一、对数据库有充分的理解 大家都知道,一般工厂...
  • sql数据库如何实现单表分组查询

    千次阅读 2018-07-20 08:58:37
    1、基本语法 select 列名1,列名2…  from 表名 group by 列名1,列名2… 2、概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行...例 :查询A表中各类别下都有哪些摘要。 Select 类别,摘...
  • 我们如何知道,我们访问的数据库的表,有哪些字段,字段的类型是什么,长度限制是什么? 在实际工作中,我就遇到过,要做动态sql,比如insert,如果是数字就不要加引号,如果是字符就要加引号,还比如做基于数据库...
  • 我分别说下这两款产品如何选择,应具备的功能有哪些,一款好的静态脱敏产品应具备以下功能:确保数据脱敏有效性:保证脱敏后的数据能够准确反映原始数据的业务属性和数据分布特征,例如对于原始数据中的姓名、地址、...
  • MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java s普通的 Java 对象)映射成数据库中的记录。每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过...
  • AbutionGraph是第一款OLAP实时图数据仓库,可以高效率的满足更多难点问题。 基数统计(不重复计数)是一个经典问题,...譬如获知“张三”去年和今年都联系过的人有哪些,我们不用像以前把“张三”两年的数据都查出来
  • Redis主要有哪些功能?1、哨兵(Sentinel)和复制(Replication)Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。Sentinel可以管理多个Redis服务器,它...
  • Redis主要有哪些功能?1.哨兵(Sentinel)和复制(Replication)Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。Sentinel可以管理多个Redis服务器,它提供...
  • Redis主要有哪些功能?哨兵(Sentinel)和复制(Replication)Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制。Sentinel可以管理多个Redis服务器,它提供了...
  • 最全面试题答案系列今天主要分享redis最全答案系列Redis主要有哪些功能?1.哨兵(Sentinel)和复制(Replication)Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵...
  • xjjdog在一些事务的基础上,再进行讨论几个容易淡忘的概念,从原始码找原因,加深我们的理解,问题大概包括:Spring的事务和数据库的事务隔离是一个概念么?春天是如何实现事务的?事务隔离机制都有哪些?事务传播...
  • 44. 复制或保存冲突之复制篇

    千次阅读 2013-07-26 10:57:55
    从理论上讲,复制要达到多个副本之间的数据完全一致的目的,或者将一个副本的数据完全覆盖另一个的数据,或者为了提高效率先检查副本之间的数据存在哪些差异,然后只写不同的部分。为了检查差异,几种途径。首先是...
  • 1、mysql -u root -p 进入mysql ...能查看数据库有哪些表 4、usemysql 对MySQL进行操作 5、set password='密码' 可以设置密码 6、grant all privileges on *.* to root@'%' identified by "密码";...
  • 17、JSP和Servlet有哪些相同点和不同点,他们之间的联系是什么? 90 18、MVC的各个部分都有那些技术来实现?如何实现? 90 19、我们在web应用开发过程中经常遇到输出某种编码的字符,如iso8859-1等,如何输出一个某种...
  • 11、EJB是基于哪些技术实现的?并说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别。 EJB包括Session Bean、Entity Bean、Message Driven Bean,基于JNDI、RMI、JAT等技术实现。 SessionBean...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 136
精华内容 54
关键字:

原始数据库有哪些