[转载]三、二、一 …… Geronimo!,第 4 部分: 模式

三、二、一 …… Geronimo!,第 4 部分: 模式


Web 浏览器标志着由数据库模式开头的这条路线的终点。如何创建一个好的数据库模式呢?您不仅需要有效的工具;还需要一个计划。设计数据库这件事,一半是科学,一半是艺术,那现在就开始操练您的技术吧。发掘一些有用的技巧,设计一个快速、有效地响应变化的数据库模式。

当您准备好在软件荒原中进行下一次 探险时,有一件事会逐渐明朗起来:没有一个好的计划,探险的路就不会走太远。动手去做任何有价值的事情时都需要了解:最终您希望取得怎样的结果,并根据这 一目标制订计划,这样就能始终以最终的成功为导向,就像大家所说的那样,然后仔细地标出达成这一目标的过程中的里程碑事件。最终,创建一个运行良好的系统 的那份激动是相当令人满足的。

Apache Geronimo 全面支持符合标准的数据库系统。但不论您的工具有多好,没有一个好的计划来定义如何达成您的目标,这些工具还是毫无用处的。


技巧 1:着眼于最终成功。不要忘记目标。


Geronimo 包含一大套 Java™ 类,这些类专门设计用于将不同的工具粘连成一个功能整体,从而创建有用的应用程序。其中最重要的工具之一就是数据库。数据库是复杂的,需要一个有效的计划来创建及操作数据库。

方案和模式

计划是多种多样的。一些是松散而又宽泛的;它们省略了大量细节而追求一些简单的目标,如最大化收益。另一些计划是紧凑而又具体的;在精确性方面,它们就像是计算机程序。松散的计划通常被认为是方案,带有某种不好的含义 —— 即应避免该方案。但一个好的、紧凑的、细节丰富的计划被认为是模式,其中反映了大量的想法和努力。

现代数据库技术借用了这一术语来命名不同数据库技术之下的数据建模时。您可以在使用可扩展标记语言(Extensible Markup Language, XML)模式、数据库模式、对象模式等的编程世界中看到使用这一术语的例子。数据库模式 是一项计划,它定义了数据库的表及各表的字段,并对关键字段予以特殊强调,这些关键字段用于查找其他表中额外的信息。

好的模式不会从天而降。构建模式需要详细调研、谨慎思考和有序的流程。这都要从定义目标并在整个项目中以目标为导向开始。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


经常、明确地沟通

记 住这一点,最佳起点即您和您的客户期望看到的信息 —— 定义系统使用方式的表单及传达信息的 Web 页面。Geronimo 会忠诚地执行应用程序代码、管理会话数据及数据库连接,同时动态地生成客户(以及他们的客户)期望看到的页面。以一种共享的视角来看待未来产品系统的外观 及其行为是很重要的。通过用 JavaServer Pages(JSP)来制订页面原型,您就能够向客户展示您的想法,客户也就能够提供有关修改外观的反馈。

我知道这样说有点老套,但如果您还没有清晰地定义前方的目标,那么可以非常轻松地开辟出通往一项良好计划的道路。花点时间来定义并精炼客户将看到的视图。这样做最终将让您漂亮地搞定一切。

例 如,假设您在为高校学生简历设计一个 Geronimo Web 应用程序,这些简历中涵盖个人信息、工作阅历及关于这些学生的其他各种信息,包括其爱好及兴趣。向学生们展示输入所有这些信息的表单时,明智的做法是让表 单保持简短,且将主要的概念分页放置:一般学生信息页面(如姓名及联系信息)、爱好及兴趣页面,工作页面,等等。一项准则就是,人们不喜欢填写带大量输入 字段的大型表单,所以应尽可能减少输入字段的数量。


技巧 2:避免杂乱。一切保持简明扼要。


在处理大概念时,应仔细观察记录间的关系,将看到一对多的模型 —— 例如,一名学生对应着多份工作或多个俱乐部。这都是将保存学生联系信息的表与保存工作经历或俱乐部经历的表中相分离的明显信号。(该过程形式上被认为是标准化。获取更多有关标准化的信息,请查阅本文末尾 参考资料 部分的相关链接。)


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


避免转移目标

让 客户确认这些视图的最终版本也很重要,这可以避免使您所追逐的目标不断发生变化。如果没有在 Geronimo 生成的这些表单和视图的最初设计上花足够的时间,此后必然会遇到麻烦。在 Geronimo 中,可以把表单和视图设计为一系列的 JSP 页面,这些页面是嵌入了 Java 代码的超文本标记语言(HTML)页面,这些 Java 代码则用以在系统处理及显示值时输入、输出及计算它们。


技巧 3:让客户确认所有的输入输出表单。避免转移目标。


收集一份良好、长的字段清单,然后继续下一阶段,概念模式 ,在其中定义系统的概念。学生简历系统的概念模式应包括一些摘要性的东西,如工作、专业、学校、学生、俱乐部及爱好。

牢记数据库的构建块及其继承关系:数据库 组成,表由字段 组成。在构造模式的第一阶段中,使用了如学生及工作等主要的概念来创建输入表单和输出报表的初始设计,目标是为数据库中最小单位的元素建立一份清单,即信息字段。这样的例子包括学生 ID、总平均成绩(GPA)、学生的专业,他或她的学校,等等。

稍后,会将这些字段分组到相应的表中,并应用标准化的规则来压缩该模式。现在,只要收集一份将在这些表中用到的字段的清单。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


从现实到概念

宽泛地讲,计算机程序员们的工作就是去设计有用的抽象概念,即观察现实世界中存在的东西,并在计算机中创建这些东西的有用的模拟物。将这些抽象的概念表现为 Geronimo 类及对象还是数据库表主要取决于您将如何使用它们,以及它们将持续多久。

例如,年龄是一个随时间而不断改变的值,可以通过一个特定的日期加以计算,即出生日期或创建日期。因而,要在数据库中使用出生日期或创建日期。但如果 Age 显示在之前讨论过的原型页面的其中一个页面里,最好将该值在代码中作为 Geronimo 类的一个方法表示,而 Geronimo 类代表了要计算年龄的那个实体。我用实体 的原因是:不论是人类、动物或汽车,出生日期、创建日期及年龄都是一回事。

作为规则,不要把计算得出的值保存在数据库中。相反,将它们计算所依据的那个参数保存起来。因而,当一些输出表(报表或 Web 页面)中显示了 Age 时,它应该是计算出来的,而不是从数据库中提取出来的。


技巧 4:不要保存能从数据库中计算出来的值。


日期计算在 Geronimo 系统中并不困难,因为定义了 Calendar 和 Date 类。系统通常只意识到当前的日期和时间,所以让计算机从当前日期中提取出出生日期来获得年龄值是一件微不足道的事。相同的原则也应用到其他日期计算中,如运输时间(交货日期减去装运时期),产品保质期计算(当前日期减去购买日期,再与保质期相比较),等等。清单 1 演示了 Geronimo 计算年龄的方法。


清单 1. 计算年龄的 Geronimo 代码
				
import java.util.Calendar;
import java.util.Date;

public class ddays
{
// Testing Framework.

public static void main(String[] args)
{
// Two date instances.
Calendar date1 = Calendar.getInstance();
Calendar date2 = Calendar.getInstance();

// Set the Birth Date.
date1.set(1975,00,17); // January = 00.

int delta = dDays(date2.getTime(), date1.getTime());
double dyears = (double) delta / 365.25;

System.out.println("Date 1: " + date1.getTime());
System.out.println("Date 2: " + date2.getTime());
System.out.println("Delta: " + delta + " Days");
System.out.println("Age: " + (int) dyears + " Years");
}

// Days between dates.

public static int dDays(Date date1, Date date2)
{
int theDiff = 0;
int totalDiff = 0;
Calendar former = Calendar.getInstance();
Calendar latter = Calendar.getInstance();

if (date1.compareTo(date2) < 0)
{
former.setTime(date1);
latter.setTime(date2);
}
else
{
former.setTime(date2);
latter.setTime(date1);
}

while (former.get(Calendar.YEAR) != latter.get(Calendar.YEAR))
{
theDiff = 365 * (latter.get(Calendar.YEAR) - former.get(Calendar.YEAR));
totalDiff += theDiff;
former.add(Calendar.DAY_OF_YEAR, theDiff);
}

if (former.get(Calendar.DAY_OF_YEAR) != latter.get(Calendar.DAY_OF_YEAR))
{
theDiff = latter.get(Calendar.DAY_OF_YEAR) - former.get(Calendar.DAY_OF_YEAR);
totalDiff += theDiff;
former.add(Calendar.DAY_OF_YEAR, theDiff);
}

return totalDiff;
}
}

在第二阶段,应专注于要设计的表以及表中要包含的字段。例 如,需要一个带基本学生信息的学生表,一个带学生及其工作的详细时间信息的工作表,及其他包含爱好、兴趣的表,等等。与保持程序定义简明扼要相同,表也应 该保持简短。信息分解是标准化过程的一部分,其设计目的是为了防止各原子信息单元出现重复,并且,也必需要有清晰的方式来构建查询,从而获取每一点信息。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


弄清概念

在概念模式后出现的是逻辑模式 —— 用更多的细节定义概念,并显示实体之间的关系的数据模型。在第三阶段,用更具体的关系来修改这些将存在于不同表的实体间的概念。学生 ID 是一个关键字段,它用以连接学生个人信息与他或她从事过的工作、该学生从属的俱乐部及该学生上过的学校。

弄 清这些概念也意味着将对应用于数据库的查询类型有所了解。绝大部分搜索都是在搜索关键字段吗?还是大量的搜索都不包含这些关键字段?设计数据库引擎是为了 基于指定关键字段构建表中记录的索引。在许多例子中,这些索引是自动生成的,且极大地提升了查找的速度,即基于指定关键字段提供查找。


技巧 5:确保选定的关键字段真实地反映要做的查询。


因 而,每个概念,即每张表,使用一个有逻辑的主键并使将要应用于该概念中的查询有意义是很重要的。工作表将包含学生曾经从事过的工作的简短信息,其目的不是 成为一份可供搜索的公司清单。每个工作实体将以学生 ID 作为主键,这样在自动构建了学生简历时,数据库只需用最少的努力即可列出与每个学生相关的工作。

当不使用关键字段而构建记录清单时,计算机的处理速度会大大降低。Job 表用于汇集学生们曾经从事过的工作的清单,将这张表用于任何其他目的是无效的。


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


标准化

数据库标准化是一个重要课题,完全可以就其写出许多著作,而且已经有了许多相关著作。标准化消除了数据冗余,并对数据进行有效的组织。标准化过程试图确保所有数据库属性只存储一个值,任何有多个值的属性应该表示在不同的表中。例如,请看下列学生记录:


Student: John Smith, College GPA: 3.20

学生和他或她的 GPA 之间存在着一个一对一的关系。这个关系有时被称为 1NF,或第一范式,根据标准化规则,这就是您要实现的目标。每个学生都有且只有一个相关联的大学 GPA。

但相同的学生在其大学生涯中却有多份不同的工作。结果是,他可能具有这样一条学生记录:


Student: John Smith, Job: Smith Brothers, Campus Coffee Shop, Bob's Burgers

由于一个属性(job)代表了许多不同的值,标准化的规则要求将这些值转移到一个不同的表中,即 Job 表中,从而满足这些规则。随后可以通过学生 ID 对 Job 表建立索引,且检索每份从事过的工作将会以一种有序且高效的方式进行。


技巧 6:标准化规则很重要。了解并应用这些规则。


涵盖所有标准化规则或提供这些规则所依据的数学背景知识已超出了本文的范围。任何想要创建数据库系统的人们必需熟悉标准化的概念,只要说明这个就够了。(参见 参考资料,获取一份关于标准化的优秀文章的链接列表。)


blue_rule.gif
c.gif
c.gif
u_bold.gif回页首


结束语

许多工具都能帮助您创建良好的数据库模式,就好像许多工具都能协助设计面向对象的系统一样。值得花些时间来探究这些工具和技术,并通过实践提高您的技术水平。现代的业务运营在数据库和 Web 站点之上,Geronimo 是将这两者整合到一起的一种强大工具。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/374079/viewspace-130304/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/374079/viewspace-130304/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值