构建AF-客户端管理器应用程序的数据库
立即解锁
发布时间: 2025-08-19 01:52:23 阅读量: 10 订阅数: 16 


Flex与Spring构建RIA企业级应用
### 构建AF - 客户端管理器应用程序的数据库
#### 1. 数据库设计概述
几乎任何应用程序都需要一种获取和显示数据的方式,富互联网应用程序(RIAs)更是如此。应用程序设计的首要阶段之一是定义数据库模式和业务对象。对于AF - 客户端管理器应用程序,我们已经定义了应用程序用于管理数据的对象,现在需要为这些数据定义并构建一个持久存储位置。
数据库设计的主要目标是构建一个可扩展且健壮的解决方案,使其不会成为系统的瓶颈。架构需要支持繁重的服务器工作负载,处理所需的用户群,并提供稳定的数据管理解决方案。性能和可靠性也是任何数据库的重要特性。
数据库解决方案的扩展在很大程度上取决于用户群的规模。对于AF - 客户端管理器应用程序,我们不需要支持200,000个用户,用户数量很大程度上取决于用户组织的规模。因此,我们不需要考虑跨多个服务器托管数据库,必要时甚至可以将数据库与Web服务器托管在同一台计算机上。随着时间的推移,数据库可能会变得非常大,所以我们将构建一个可以随数据扩展的数据库模式。
#### 2. 数据库术语
在深入了解数据库设计的细节之前,让我们回顾几个术语的定义:
- **数据库**:数据库是一组相关数据的集合,可以从外部源进行持久化存储。数据库可以非常复杂,包含数百万行数据,也可以简单到只是安全数据集中的几个用户。
- **表**:表由列和行组成,类似于电子表格。列被赋予唯一的名称以定义数据元素。
- **键**:键是指向一行或多行数据的唯一指示器。主键是可以标识表中单行的唯一标识符。外键是表中可以标识另一个表中一行的键。主键到外键的连接是关系数据库的基础。
#### 3. 数据库设计技巧
采用可靠的方法构建表有助于减轻跨多个表交付数据的压力。以下是一些良好数据库设计的准则:
- 去除表中的冗余数据。将常见对象(如地址和电话号码)分离出来。
- 列不应代表像invoice1、invoice2等这样的数据集,这是行的用途。
- 小心使用表的AUTO_INCREMENT属性。在我们的示例中,我们需要为objectIdentifier值创建一个唯一的生成方案,以便每个表的主键始终具有唯一的编号。
- 尽可能减小存储需求,以减少磁盘空间消耗。
- 识别频繁查询,以正确调整数据库。
- 创建表时要牢记命名约定(表名区分大小写,列名不区分大小写)。
- 首次安装数据库时,会有一个初始用户root。设置密码,然后重命名该用户。
- 在适当的情况下,让Tomcat或应用程序服务器控制数据库连接池。
- 通过仅允许操作系统上的特殊用户访问,锁定数据库安装目录,这样可以保护数据文件,防止管理员或其他用户意外损坏它们。
- 不要将媒体对象(如文件和电影)存储在数据库中,最好只存储指向文件系统上媒体的指针。
#### 4. MySQL数据库概述
在开始为表执行CREATE TABLE语句之前,你需要了解MySQL对于开发RIAs重要的功能。这里使用的是MySQL社区服务器,可从http://dev.mysql.com/downloads免费下载。
#### 5. MySQL中的表类型
在MySQL中创建表时,可以指定其类型(使用ENGINE = 指令)。如果不指定表类型,MySQL将根据默认表类型的配置为你选择。对于构建RIAs,有三种表类型值得关注:
| 表类型 | 描述 |
| ---- | ---- |
| HEAP | 当在MySQL中创建临时表时使用。当表大小适合数据库服务器的物理内存且更新较少时也可使用。 |
| MyISAM | 当磁盘空间和读取效率是高优先级时最适合。数据库速度主要受底层硬件(特别是随机访问内存(RAM)的数量)限制。MyISAM通常是MySQL的默认存储引擎。 |
| InnoDB | 提供数据库事务、行级锁定、外键约束和崩溃恢复。如果应用程序需要事务、更高的数据库安全性或许多并发用户进行更改,可考虑将表设置为InnoDB类型。 |
对于AF - 客户端管理器应用程序,我们将所有表设置为InnoDB类型,以利用其提供的高级功能。
#### 6. MySQL中的数据类型
在任何数据库中构建表的一部分是为每列定义数据类型。选择列数据类型决定了可以存储的信息类型。以下是MySQL支持的数据类型总结:
| 类型 | 数据类型 | 描述 |
| ---- | ---- | ---- |
| CHAR() | 文本 | 固定字符集,0 - 255 |
| VARCHAR() | 文本 | 可变字符集,0 - 255 |
| TINYTEXT | 文本 | 最大255个字符的字符串 |
| TEXT | 文本 | 最大65,535个字符的字符串 |
| BLOB | 文本 | 最大65,535个字符的字符串 |
| MEDIUMTEXT | 文本 | 最大16,777,215个字符的字符串 |
| MEDIUMBLOB | 文本 | 最大16,777,215个字符的字符串 |
| LONGTEXT | 文本 | 最大4,294,967,295个字符的字符串 |
| LONGBLOB | 文本 | 最大4,294,967,295个字符的字符串 |
| TINYINT() | 数字 | 正常范围 -128到127,无符号范围0到255 |
| SMALLINT() | 数字 | 正常范围 -32,768到32,767,无符号范围0到65,535 |
| MEDIUMINT() | 数字 | 正常范围 -8,388,608到8,388,607,无符号范围0到16,777,215 |
| INT() | 数字 | 正常范围 -2,147,483,648到2,147,483,647,无符号范围0到4,294,967,295 |
| BIGINT() | 数字 | 正常范围 -9,223,372,036,854,775,808到9,223,372,036,854,775,807,无符号范围0到18,446,744,073,709,551,615 |
| FLOAT | 数字 | 带小数点的小数字 |
| DOUBLE(,) | 数字 | 带小数点的大数字 |
| DECIMAL(,) | 数字 | 以固定小数点字符串形式存储的DOUBLE |
| DATE | 日期 | 格式化日期,YYYY - MM - DD |
| DATETIME | 日期 | 格式化日期和时间,YYYY - MM - DD HH:MM:SS |
| TIMESTAMP | 日期 | 格式化日期和时间,YYYYMMDDHHMMSS |
| TIME | 日期 | 格式化时间,HH:MM:SS |
| ENUM() | 其他 | 具有定义值的枚举列 |
| SET | 其他 | 每列可以有多个定义值 |
#### 7. 层次结构存储
在许多情况下,需要保留层次结构以在用户界面中显示。Flex有树视图,我们将在AF - 客户端管理器应用程序中使用它来排列项目任务。为了使用Flex中的ArrayCollection实现这一点,我们需要保留标识父子关系的行指示器。
一个管理数据库中层次结构的好方法是在负责层次结构的表中保留父标识符。以下是一个跟踪编程语言层次结构的数据库表示例:
| objectIdentifier | languageName | nodeID |
| ---- | ---- | ---- |
| 1 | All Languages | 0 |
| 2 | Flex | 1 |
| 3 | ActionScript | 2 |
| 4 | MXML | 2 |
| 5 | Spring | 1 |
| 6 | ORM | 5 |
| 7 | Hibernate | 6 |
| 8 | iBATIS | 6 |
可以看到,programming_lang表通过nodeID定义了父子关系。nodeID只是父对象的objectIdentifier。从数据库获取此列表后,我们可以根据objectIdentifier到nodeID的顺序和关系将其上传到树结构中。为了使这正常工作,需要按nodeID对查询进行排序,以便在Flex客户端中高效加载数据,如下所示:
```sql
SELECT * from programm
```
0
0
复制全文
相关推荐










