apache derby
关系数据库系统的基础
在开始开发数据库应用程序之前,您需要了解基本概念。 本节介绍了Apache Derby中可用的数据类型以及影响您设计和创建有用的Derby数据库应用程序的能力的规则。
关系数据库保存数据。 该数据可以具有不同的类型,例如数字,字符或日期。 在数据库中,数据被组织成称为表的逻辑单元。 表格就像电子表格一样,因为它包含数据行。 每行由许多列组成。 这些列保存特定数据类型的数据,例如整数值或字符串。 在大多数情况下,一个数据库有多个表。 为了将表关联在一起,数据库设计人员利用了表之间的自然(或人工)链接。 在电子表格中,您可以按单元格值链接不同工作表中的行。 关系数据库中也存在相同的想法,用于建立链接的列称为键列 。
为了更容易理解表或特定列的目的,应选择适当的名称。 数据库之间的命名约定可能会有所不同。 对于Apache Derby数据库系统,各个名称:
- 不区分大小写。
- 长度限制为128个字符。
- 必须以字母开头。
- 必须仅包含Unicode字母,下划线字符和Unicode数字。
您可以通过将名称放在双引号中来逃避这些规则,这可以使名称区分大小写并包含其他字符(包括空格)。 但是,这样做通常是一个坏习惯:要求名称始终用双引号引起来,并且很容易使其他可能维护您代码的人感到困惑。
德比风格
本系列文章遵循一种特定的样式:所有SQL命令全部以大写形式显示,项目名称使用camelCase。 在camelCase样式中,单词被连接在一起,并且每个单词的个字母(个字母之后)被大写,例如aLongIdentifier
。 将这两种样式组合在一起,这些文章使用以下样式编写SQL命令: SELECT aLongIdentifier FROM bigdog.dataTable ;
。
相关表通常组合在一起成为一个模式 。 您可以将模式视为特定数据库中所有相关结构定义的容器。 表名在给定架构中必须。 因此,通过使用架构,您可以将名称相同的对象(例如表)包含在不同的架构中。 使用Apache Derby数据库时,表始终位于模式中。 如果未明确指定架构,则Derby隐式使用内置的apps
架构。 第二个称为sys
内置模式用于隔离系统表。
您可以使用架构名称来限定名称。 为此,请指定架构名称,后跟句点,然后是表名称。 例如, bigdog.products
引用bigdog
模式中的products
表。 如果没有相关的架构名称,则表名称被认为是不合格的 ,就像在products
。 当在bigdog.products
中完全指定了架构名称和表名称时,该名称被称为完全限定 。
从抽象的意义上讲,这些数据库概念可能看起来令人困惑,但是实际上它们非常简单。 例如,假设您拥有一家名为Bigdog's Surf Shop的商店,该商店出售各种商品,例如太阳镜,衬衫等。 如果您想获利,则必须密切关注库存,以便可以轻松订购更多库存或更换供应商,以将间接费用降至低。 跟踪此信息的一种简单方法是以表格形式写入条目, 如图1所示。
通过这种简单的可视化设计,您可以轻松地将业务逻辑直接映射到数据库表中。 您有两个数据库表,即“产品”和“供应商”,它们自然通过项目编号链接。 每个表中列的数据类型很容易确定。 本文的其余部分重点在于在Derby数据库中为Bigdog的Surf Shop创建示例架构-该架构由这两个表组成。
使用关系数据库:结构化查询语言
SQL NULL类型
在开始创建数据库表之前,您必须知道在未为列指定任何值时该怎么做。 为了说明这一点,假设您被要求填写一个Web表单。 如果将特定的列留空,则将什么插入到数据库中? 可以想象,如果您不必跟踪任何价值标记,那么这个问题可能会很麻烦。 幸运的是,SQL定义了一个特殊值NULL
,以指示一列没有值。
数据库系统可以是复杂的软件,尤其是当它们扩展以支持企业级应用程序时。 因此,您可能希望每个数据库都有其自己的应用程序编程接口(API),并且这些API可能在一个系统与另一个系统之间是不同的。 当关系数据库开发时,就是这种情况。 但是,幸运的是,许多供应商同意开发一种用于访问和操作关系数据库的标准语言。 该语言正式称为结构化查询语言(或SQL,发音为sea-quill )。 已经产生了几种正式的标准版本,其中一个在1992年被称为SQL-92,一个在1999年被称为SQL-99。 Apache Derby数据库提供了SQL-92标准的几乎完整的实现,因此使用Derby开发的应用程序可以轻松地传输到其他数据库系统。
SQL具有两个主要组件:数据定义语言(DDL)和数据操作语言(DML)。 DDL命令用于创建,修改或删除数据库中的项目(例如表)。 DML命令用于在数据库的表中添加,修改,删除或选择数据。 本文的其余部分对SQL的DDL组件进行了基本介绍。 以后的文章将重点介绍DML命令和更的DDL命令。
SQL数据类型
SQL本身就是一种编程语言,它定义了丰富的数据类型层次结构。 保留这些数据类型是数据库重要的职责之一。 随着数据库变得越来越强大,这种类型的层次结构变得越来越复杂。 但是大多数简单的数据库并不需要全部允许的类型,通常它们只需要存储数字,字符以及日期或时间数据。 为了简单起见,表1、2、3和4列出了Derby中实现的基本SQL数据类型。
如表1所示,Derby支持三种不同的整数数据类型。 这些类型的区别在于它们可以存储的整数范围,因此可以根据它们在数据库中所需的存储空间量来区分。 设计数据库时要牢记的关键问题之一是,始终尝试尽量减少表占用的存储量。 通常,较小的表可提供更高的性能,但是您必须能够将数据存储在结果表中。 为了记录在案,2 31等于2,147,483,648,2 63等于9,223,372,036,854,775,808,因此使用这些数据类型可以存储很大的整数!
表1. Derby中的基本整数数据类型数据类型 | 低值 | 大值 | 例 | 描述 |
---|
SMALLINT | -32768(-2 15 ) | 32767(2月15日至 1 日 ) | itemNumber SMALLINT | 2字节整数表示 |
INT | -2 31 | 2 31-1 | itemNumber INT | 4字节整数表示 |
BIGINT | -2 63 | 2 63-1 | itemNumber BIGINT | 8字节整数表示 |
大多数数字数据不能表示为整数。 Derby支持多种格式的实数:单精度浮点数,双精度浮点数和表示的十进制数,如表2所示。
表2. Derby中的基本数值数据类型数据类型 | 低值 | 大值 | 例 | 描述 |
---|
REAL | -3.402x10 +38 | 3.402x10 +38 | price REAL | IEEE浮点数(4个字节) |
DOUBLE | -1.79769x10 +308 | 1.79769x10 +308 | price DOUBLE | IEEE浮点数(8字节) |
DECIMAL | 31(高精度) | price DECIMAL(5,2) | 的十进制表示 |
如果您从未遇到过的精度数据类型,则十进制和浮点类型之间的区别可能会引起混淆。 不同之处在于计算机中使用的浮点数据类型不能容纳每个实数。 这可能看起来很奇怪,但请记住,有无数个不同的实际值。 大多数实数不能仅存储在几个字节的内存中。 对于某些应用,这种精度损失是可以接受的。 但是,在许多情况下不是。 例如,金融应用程序不能仅仅由于无法将特定号码存储在计算机中而承受损失。
这个问题的解决方案是使用DECIMAL
数据类型,它允许您控制的总位数的计算机存储( 精度 )和随后的小数点( 比例 )的位数。 要创建十进制类型,请指定要存储的数据的精度和小数位数。 DECIMAL
数据类型所需的存储可能比普通浮点数据类型大得多。 因此,您应该谨慎使用此类型,否则应用程序的性能可能会降低。 默认情况下, DECIMAL
类型的小数DECIMAL
为0,这意味着DECIMAL
数据类型模仿整数类型。
数字类型有几种同义词。 例如, DECIMAL
数据类型可以缩短为DEC
或称为NUMERIC
。 DOUBLE
类型也可以称为DOUBLE PRECISION
,尽管尚不清楚为什么每次需要双精度数字时都要键入多余的单词。 一个更通用的同义词是FLOAT
类型,它具有任意浮点精度,您可以在将数据类型声明为FLOAT(val)
时指定该精度。 精度必须是小于53的正数; 如果不是,则会出现错误。 如果将精度指定为23或更小值,则FLOAT(val)
等同于REAL
; 如果精度在24到53之间,则FLOAT(val)
等效于DOUBLE
。
除数字数据外,要存储在数据库中的另一种流行的数据类型是字符数据。 字符数据的示例包括项目说明,人的姓名或地址信息。 Derby提供了两种简单的存储字符数据的技术: CHAR
类型和VARCHAR
类型,如表3所示。对于这两种类型,您都可以指定一个length
参数,如果未指定任何值,则默认为1。 这两种字符数据类型之间有两个主要区别。 首先, CHAR
类型的大长度为254个字符,而VARCHAR
类型多可容纳32,672个字符。 第二个区别更加微妙: CHAR
类型始终是您指定的长度。 如果未指定足够的字符,则会插入多余的空格以填充剩余的位置。 使用VARCHAR
,字符数可以变化,并且不执行额外的填充。
表3. Derby中的基本字符串数据类型数据类型 | 大长度 | 例 | 描述 |
---|
CHAR | 254 | description CHAR(128) | 定长字符串 |
VARCHAR | 32,672 | description VARCHAR(128) | 可变长度字符串 |
由于宽度的变化, VARCHAR
类型在实际存储空间方面可能更有效,但在性能方面也可能效率较低。 CHAR
数据类型可提高性能,因为数据库确切知道每个CHAR
列的大小,并且可以在读取或写入数据时进行某些性能优化。 VARCHAR
列的大长度似乎足够大,但是Derby提供了更大的字符数据类型,这将在以后的文章中进行讨论。
后一种简单的数据类型Derby提供存储日期和时间,如表4所示TIME
数据类型以24小时格式( HH:MM:SS
)存储小时,分钟和秒。 DATE
数据类型存储月,日和年,可以用多种不同的格式来指定,包括以下格式:
yyyy-mm-dd
mm/dd/yyyy
dd.mm.yyyy
表4. Derby中的基本日期和时间数据类型数据类型 | 低值 | 大值 | 例 | 描述 |
---|
TIME | 00:00:00 | 24:00:00 | start TIME | 时间表示(秒精度) |
DATE | 0001-01-01 | 9999-12-31 | stockDate DATE | 日期表示(星期精度) |
Derby还提供了TIMESTAMP
数据类型,该数据类型将TIME
和DATE
数据类型组合为单一类型,以标记准确的时间。
在Derby中创建表
到目前为止,您已经学习了如何设计表,包括映射表列和定义每列的数据类型。 在正确设计了表之后,使用SQL创建表的方法很简单。 清单1显示了在Derby中创建表的正式语法。
清单1. Apache Derby的CREATE TABLE语法
-- Comment describing the purpose and layout of the table CREATE TABLE [schemaName.]tableName ( { <columnDefinition> | <tableLevelConstraint> } [, { <columnDefinition> | <tableLevelConstraint> } ]* ) ;
次查看此语法后,您可能会感到困惑。 但是,一旦掌握了基础知识,就很容易遵循。 如果您想精通Derby,则必须了解正式的语法。 方括号( [
和]
)包含可选参数。 从形式语法中可以看到,模式名称是可选的,所需的初始定义之后的任何列定义或表级约束也是如此(创建没有列的表是没有意义的!)。
您可能了解列定义的含义,但可能不了解约束的概念。 约束有两种类型:表级约束和列约束。 约束以某种方式限制列或表。 例如,您可以使用约束来要求始终为列分配一个实际值(没有NULL
值),或者列中的每个条目都必须是的,或者为列自动分配一个默认值。 将来的文章将更详细地讨论约束。
后一个方括号后的星号( *
)表示可以包含多个封闭项。 这意味着表必须具有一个或多个列或表级约束。 垂直线( |
)表示“或”条件。 在此语法示例中,您必须定义新列或定义新表级约束。 大括号( {
和}
)将相关项组合在一起,而括号( (
和)
)是必填元素。 后,分号( ;
)表示SQL语句的结尾。
将这些规则付诸实践相对简单。 清单2显示了如何使用Derby附带的ij
工具创建图1前面演示的表。
清单2.在Apache Derby中创建一个表
rb$ java org.apache.derby.tools.ij ij version 10.1 ij> connect 'jdbc:derby:test;create=true' ; ij> CREATE TABLE bigdog.products ( itemNumber INT NOT NULL, price DECIMAL(5, 2), stockDate DATE, description VARCHAR(128) ) ; rows inserted/updated/deleted ij> CREATE TABLE bigdog.vendors ( itemNumber INT NOT NULL, vendorNumber INT NOT NULL, vendorName CHAR(64) ) ; rows inserted/updated/deleted ij> exit ;
与Derby数据库进行交互的简单方法是使用ij
工具,该工具在本系列的篇文章“ 用Apache Derby进行开发-达到Trifecta:Apache Derby简介 ”中进行了介绍 (developerWorks,2006年2月)。 如果遵循清单2中所示的动作,则首先创建一个名为test
的新数据库。 如果test
数据库已经存在,则在发出connect
语句时可能会收到警告消息。 可以安全地忽略此警告。 接下来,您隐式创建一个名为bigdog
的新架构,并显式创建两个存储在bigdog
架构内的新表( products
和vendors
。 因为您不发出CREATE SCHEMA
语句,所以模式的创建是隐式的。
products
表具有四列: itemNumber
, price
, stockDate
和description
。 itemNumber
每个项目(或行)提供的标识,并具有附加的列级约束,该约束强制始终提供有效值( NOT NULL
)。 如果没有此要求,则不能保证itemNumber
列是的,因为可以为多个列分配NULL
值。 price
列创建为DECIMAL
数据类型,精度为5,小数位数为2。这意味着任何物品可以具有的高价格为$ 999.99。 后两列很简单: stockDate
列存储为Date
, description
存储为一个字符串,大长度为128,该长度被截断为所提供的任何长度。
该vendors
表有三列: itemNumber
, vendorNumber
和vendorName
。 在这种情况下, itemNumber
和vendorNumber
列都具有附加的列级约束( NOT NULL
)。 此外, vendorName
列存储为字符串,大长度为64。由于vendorName
列使用CHAR
数据类型存储,因此始终保留64个字符空间。
创建各种项目之后,您可能想知道是否有一种简单的方法来查看数据库中存储了哪些项目。 幸运的是,使用dblook
工具的答案是肯定的。 运行此工具(如清单3所示)提供了在特定数据库中创建的项目的详细列表。
清单3.使用dblook查看模式
rb$ java org.apache.derby.tools.dblook -d jdbc:derby:test -- Timestamp: 2006-03-04 10:52:34.056 -- Source database is: test -- Connection URL is: jdbc:derby:test -- appendLogs: false -- ---------------------------------------------- -- DDL Statements for schemas -- ---------------------------------------------- CREATE SCHEMA "BIGDOG"; -- ---------------------------------------------- -- DDL Statements for tables -- ---------------------------------------------- CREATE TABLE "BIGDOG"."PRODUCTS" ( "ITEMNUMBER" INTEGER NOT NULL, "PRICE" DECIMAL(5,2), "STOCKDATE" DATE, "DESCRIPTION" VARCHAR(128)); CREATE TABLE "BIGDOG"."VENDORS" ( "ITEMNUMBER" INTEGER NOT NULL, "VENDORNUMBER" INTEGER NOT NULL, "VENDORNAME" CHAR(64));
dblook
工具是另一个Java类,使您可以轻松地将数据库的内容转储到控制台。 您可以像在任何Java程序中一样,从命令提示符下运行它。 的增加是使用了-d jdbc:derby:test
参数,该参数指定dblook
工具应查询哪个数据库。 如果可以运行ij
工具,则dblook
类文件已在CLASSPATH
。 如果不是,请参考本系列的篇文章 ,以获取有关正确设置CLASSPATH
更多详细说明。 如dblook
工具的输出所示, test
数据库包含bigdog
模式,其本身包含products
和vendors
表。 此外,这两个表的各个列都已详细列出。
在Derby中删除表
没有人是完美的。 错误创建表或不再需要表时该怎么办? 简单的答案是从数据库中删除该表,并在必要时创建替换表。 删除表格很容易,这当然意味着您在执行此操作时要格外小心-不会弹出对话框,询问您是否确定要继续!
从数据库中删除(或更正式地说是删除 )表的完整语法为:
DROP TABLE [schemaName.]tableName ;
语法很简单:将完全限定的名称和分号附加到DROP TABLE
SQL命令中,就可以完成了。 清单4在新创建的临时表上演示了删除表的过程。
清单4.从Derby数据库删除表
rb$ java org.apache.derby.tools.ij ij version 10.1 ij> connect 'jdbc:derby:test' ; ij> CREATE TABLE temp ( aColumn INT ) ; rows inserted/updated/deleted ij> DROP TABLE temp ; rows inserted/updated/deleted ij> exit ;
摘要
您在使用Apache Derby中的数据库方面做的很好。 现在,您已经掌握了数据库的基本概念,包括模式,表和列,并且已经看到了使用名为Bigdog's Surf Shop的虚拟企业对这些概念的演示。 要使用像Derby这样的数据库,您知道需要学习SQL(与数据库交互的标准语言)。 本文还介绍了可用于在Derby数据库中存储数据的基本数据类型。 将这些概念放在一起,您学习了如何使用Derby创建和删除表,并使用Derby dblook
工具转储数据库的架构内容。
翻译自: https://www.ibm.com/developerworks/opensource/library/os-ad-trifecta3/index.html
apache derby