Skip to content

2. 案例研究

2.1. 问题

让我们回到我们要构建的应用程序。我们以一个具有以下架构的现有应用程序为起点:

对于希望进一步了解以下内容的人士:

  • NHibernate:ORM Nhibernate [http://tahe.developpez.com/dotnet/nhibernate/] 简介;
  • 基于ASP.NET(WebForms)结合NHibernate和Spring的应用程序: 使用 ASP.NET、Spring.NET、NHibernate 和 [http://tahe.developpez.com/dotnet/pam-aspnet/] 构建三层 Web 应用程序。

我们希望将之前的应用程序转换为如下形式:

其中 EF5 已替换 NHibernate。 该应用程序是研究 EF5 的一个契机。由于 Spring.NET 允许我们轻松更换层而不破坏现有结构,因此应用程序 2 将使用与应用程序 1 相同的 [ASP.NET] 层。 由于本文主要探讨EF5,我们将不详细说明该层的实现细节。我们将在应用2中引入它以验证其功能正常。我们仅说明在Spring.NET的配置文件中需要进行的修改。

案例研究如下。我们希望为医生提供一项基于以下原则运行的预约服务:

  • 由秘书处负责为众多医生处理RV的预约事宜。该服务可由单人承担。其薪资由所有使用RV服务的医生共同分摊;
  • 秘书处及所有医生均接入互联网;
  • RV数据存储于中央数据库中,秘书处和医生均可通过互联网访问;
  • RV的登记通常由秘书处负责。医生本人也可进行登记。特别是在诊疗结束时,医生亲自为患者开具新的RV的情况下。

RV开立服务的架构如下:

如果医生们不再需要处理RV,他们的工作效率将得到提升。如果参与人数足够多,他们对秘书处运营费用的分摊将微乎其微。我们将该应用程序命名为[RdvMedecins]。以下是该应用程序运行时的屏幕截图。

该应用程序的首页如下:

Image

从该首页开始,用户(秘书处、医生)将执行一系列操作。我们将在下文中进行说明。左侧视图展示了用户提交请求时的界面,右侧视图则展示了服务器发送的响应

2.2. 数据库

应用程序 NHibernate 使用的数据库是 MySQL5 数据库,其中包含四个表:

Image

我们将以此作为参考来构建所有数据库。

2.2.1. 表 [MEDECINS]

该表包含由应用程序 [RdvMedecins] 管理的医生信息。

  • ID:医生标识号——该表的主键
  • VERSION:表中该行的版本标识号。每次对该行进行修改时,该数字都会增加1。
  • NOM:医生姓名
  • PRENOM:其名字
  • TITRE:其称谓(小姐、女士、先生)

2.2.2. 表 [CLIENTS]

各医生的患者信息存储在表 [CLIENTS] 中:

  • ID:客户标识号——该表的主键
  • VERSION:标识表中该行版本的编号。每次对该行进行修改时,该数字会递增1。
  • NOM:客户姓名
  • PRENOM:客户名字
  • TITRE:其称谓(小姐、女士、先生)

2.2.3. 表 [CRENEAUX]

该表列出了可进行 RV 操作的时间段:

 
  • ID:时间段标识号——该表的主键
  • VERSION:表中该行的版本标识号。每次对该行进行修改时,该数字会递增1。
  • ID_MEDECIN:标识该时段所属医生的编号——MEDECINS(ID)列的外键。
  • HDEBUT:时段开始时间
  • MDEBUT:时段开始分钟
  • HFIN:时段结束时间
  • MFIN:时段结束分钟

例如,表 [CRENEAUX](参见上文 [1])的第二行显示,第 2 号时段于 8 点 20 分开始,8 点 40 分结束,并归属于第 1 号医生 (玛丽女士 PELISSIER)。

2.2.4. 表 [RV]

该表列出了每位医生所分配的RV时段:

  • ID:唯一标识RV的编号——主键
  • JOUR:RV的日期
  • ID_CRENEAU:RV的时间段——作为外键关联至QZXW2HTMLP000219ZX表中[ID]列——同时确定时间段和相关医生。
  • ID_CLIENT:预订对象的客户编号——作为表[CLIENTS]中[ID]列的外键

该表的 对关联列(JOUR、ID_CRENEAU)的值施加了唯一性约束:

ALTER TABLE RV ADD CONSTRAINT UNQ1_RV UNIQUE (JOUR, ID_CRENEAU);

如果表[RV]中某行具有值 (JOUR1, ID_CRENEAU1) 作为列值(JOUR, ID_CRENEAU),则该值在其他任何地方都不能出现。 否则,这意味着同一时间针对同一位医生生成了两个 RV。从 Java 编程的角度来看,当这种情况发生时,数据库中的 JDBC 驱动程序会触发一个 SQLException

id 行值为 7(参见上文的 [1]),表示在 2006 年 9 月 10 日,第 10 个时段和第 2 号客户被分配了一个 RV。 从表[CRENEAUX]中可知,第10号时段对应11:00-11:20,由第1号医生(Marie PELISSIER女士)负责。 表 [CLIENTS] 显示,客户编号 2 是克里斯汀·GERMAN 女士。

本案例研究曾作为Java文章[http://tahe.developpez.com/java/primefaces]的主题,其中使用了Java版的Hibernate(ORM)。