hhhhhh.

ABAP数据库基础,索引,数据完整性

ABAP数据库基础

        AS ABAP中的所有应用相关的数据在关系型数据库中管理,所有的ABAP应用默认在这个数据上工作,AS ABAP支持不同供应商的数据库系统,在ABAP中嵌入的SQL既可以是标准化的Open SQL或者是特定供应商的原生SQL。关系型数据库是基于关系型数据模型,关系型数据模型中使用的形式结构是关系和表,在AS ABAP,数据模型在ABAP数据词典中管理,接近ABAP类型的概念,现实世界建模领域的所有信息在表中用值来表示。一些基本概念如下:

  • 表:是一个包含了行和列的二维矩阵。

  • 域:字段的值范围(字段允许的值)。

  • 键:一个或者多个联合的字段,能够唯一标识出表中的一行。

  • 主键:每个表必须有至少一个键(主键完整性)。通常表会有多个键,根据处理模型,只有一个键被定义为主键。

  • 外键:在关系模型,对象之间的关系被表示为外键。表中的联合字段如果在其他表中是主键,它就是当前表中的外键。

说明:主键可以有900bytes,如果键大于120bytes,会有如下的限制:

  • 表的内容不能够通过指定完全的键值来传输,你需要指定有不大于120bytes的通用键值来指定。

  • 表不能够作为标准锁对象的基础表。

索引

        数据库中的索引可以帮助提升查询数据库中记录的速度,索引是一个被选择的数据库字段的存储副本。

主索引

        主索引是一个从主键字段中的字段构建出来的一个唯一索引,在AS ABAP中,它总是被自动创建,对于每个索引字段的组合表中最多存在一条数据。如果结果集合不能用主索引来标识,则没有字段从主键索引选择,然后整个表会被扫描。

次级索引

当标识出结果集为了限制扫描到的记录的数量,唯一和不唯一的次级索引可以在ABAP数据词典中被创建。创建次级索引在以下的情况下是有益的。

  • 待查询表的条目基于不包含在索引中的字段,如果响应时间非常慢,然后创建一个合适的次级索引。

  • 每个索引条目关联至多5%的表条目。

  • 数据库表主要是用来读取数据条目,当访问数据表来修改条目,每个附加的索引必须也被更新。

  • 如果只有那些读的字段也存在于索引,数据就不需要在索引访问后被第二次访问。如果只有很少的字段被选择,如果这些字段被包含到他们条数中索引中将会获得非常显著的效果。

注意事项:

       SQL跟踪工具(事务码ST05)可以用来查看哪个索引被数据库系统用来访问数据,一个索引只能够支持明确地描述查询的值,比如=或者like。条件中包含例如<>,响应时间是不能通过索引来提升的。

         一个索引应该只包含几个字段;作为一个规则,不超过4个。这是因为在数据库操作每次更新这些字段时,索引必须被更新。适合索引的如下:

  • 常常选择的字段和拥有更高的选择级别的时候,你应该在索引的开始替换大多的可选择字段。

  • 对于表中大多的条目来说如果他的值是初始化的你不应该把该字段包含到索引中。

  • 如果对于数据表你使用多于一个索引,确保他们不会重叠。

对于任何的数据表你不应该创建超过5个索引,因为:

  • 每个索引产生附加的更新消耗

  • 数据量的增长

  • 数据库系统的优化器提供了多种选项并且变得更加易于出错。

      优化程序通常在选择条件包含OR的时候停止。换言之,当选择和应用索引的时候它不评估被OR选择的字段。一个例外是OR关系独立存在。因此,对于一个被定为索引的字段试图重新定制条件包含一个OR关系。

说明:

    在一些数据库系统中0值会被索引忽略,意味着当通过0值选择数据的时候没有索引会被使用。

例如:

在下面的查询语句,优化器会停止工作,当出现OR。

SELECT * FROM SPFLI WHERE CARRID = 'LH' AND ( CITYFORM = 'FRANKFURT' OR CITYFROM = 'NEW YORK' ).

我们采用下面等效的语句替换,条件可以被使用优化对于已存在的索引。

SELECT * FROM SPFLI WHERE (CARRID = 'LH' AND  CITYFORM = 'FRANKFURT' ) AND(CARRID = 'LH' CITYFROM = 'NEW YORK' ).

数据库完整性(Database Integrity)

       数据库是真实世界一部分的模型。它应该是一致的并且它的内容应该匹配他建模的真实部分。数据完整性是当编写应用软件时引入的最重要的方面。数据完整性区分:

  • 语义完整性(Semantic Integrity)

  • 关系完整性(Relational Integrity)

  • 操作完整性(Operational Integrity)

(1)语义完整性

       语义完整性指定是数据的一致性和完整性,在航班预订系统,比如字段对于每个航班‘占用座位数’必须总是包含一个值,小于或者等于“最大座位数”字段-为了避免超额预订,如果不是这样的话,数据是不一致的。另外,每次预订在航班预订表中必须增长字段“占用座位数”的内容,同时,这些操作形成了一个单元,如果只有一个动作被执行,数据库会变得不完整。

         在许多数据库系统中,你可以通过约束或者触发器检查语义完整条件,但是由于这些方法在AS ABAP中并未被使用,因为缺乏标准化;应用程序的程序员因此必须在AS ABAP中验证数据库的语义完整性。

       如航班预订系统中展示的那样,数据通常处于不一致或者不完整的状态在事务的过程中,由于这个原因,程序员需要能够确认事务的结束并且恢复数据的语义完整性。这个是通过数据库提交完成的。

(2)关系完整性

      关系完整性指的是对管理关系模型的完整性规则的遵守。由于在AS ABAP中数据模型基于关系数据模型,这些规则必须被遵守,包括:

  • 主键完整性

       每个数据库对象必须被主键唯一标识。

       和关系理论相对,你可以在大多的数据库系统中创建没有主键的数据表。在ABAP/4数据词典,每个表必须含有主键。因为这个原因主键完整性性是自动的。

  • 值范围的完整性

        表中每个字段的值必须在这个字段的值范围内。在航班预订系统,比如,你必须能够在私有的和商业客户之间区分。这个意味着字段‘Business/private客户’只能包含值‘B’(商业客户)或者'P'(私人客户)。在大部分的数据库系统,你可以指定值得范围作为定义表字段的约束。数据库系统自动阻止了表中出现无效的值。然后,尽管这些方步在AS ABAP中不再使用,你可以在ABAP数据词典中给域和数据字段定义值范围,然后使用它们获得数据库的完整性。在对话框事务,系统使用这些知识检查用户输入并且显示可能的条目。

  • 外键完整性(参照完整性)

      每个外键必须指向一个已经存在的主键。在航班服务系统,例如,对于每个航班字段‘Airline carrier’的内容必须在航线表里。

         在多数的数据库系统,当定义一个表的时候你可以指定外键的关系作为约束。在数据库系统然后自动阻止了无效的航线出现在数据库系统。然而,这些方法在AS ABAP中不再使用,你可以定义外键的关系在ABAP数据词典的表之间,然后使用它们获得数据库的完整性。在对话框事务,系统使用这个知识检查用户的输入并且显示可能的值。

(3)操作完整性

        操作完整性对于多个用户企图同时访问数据集获得对数据集不一致性的保护。这个的必要性通过下面的例子演示,用户S1和S2想要同时在航班系统中预订。

  • S1从航班表读计划航班的航线,占用座位小于最大座位数

  • S2从航班表读计划航班的航线,占用座位小于最大座位数

  • S1进行了一个新的航班预订

  • S1将占用座位数+1

  • S2进行了一个新的航班预订

  • S2将占用座位数+1

由于S1,S2查到了同样的占用座位数,所以航班可以超额预订。

数据库系统通过加锁竞争性访问保证自动获得操作完整性。这个过程通过数据库加锁完成,演示如下:

  • S1带着要修改的意图从航班表读计划航班的航线,占用座位小于最大座位数。

  • S1带着要修改的意图从航班表读计划航班的航线,由于S1锁住了航线,S2必须等待。

  • S1进行了一个新的航班预订

  • S1将占用座位数+1

  • S1结束了LUW(Logicl Unit of Work),因此释放了数据库锁。

  • S1现在可以从航班表访问计划航班的航线,占用座位小于最大座位数。

  • S2进行了新的航班预订

  • S把占用的座位数+1

  • S2结束了LUW(Logicl Unit of Work),因此释放了数据库锁。

另外,ABAP数据库可通过如下四种方式访问:

  • Open SQL

  • 对象服务(Object Services)

  • 原生SQL(Native SQL)

  • ADBC-ABAP数据库连接

posted @ 2022-04-18 16:35  iceyou  阅读(919)  评论(0)    收藏  举报