代码之家  ›  专栏  ›  技术社区  ›  Abe Voelker

将过程性、古老的CRUD代码和专有DBMS迁移到SQL上的OO ORM

  •  1
  • Abe Voelker  · 技术社区  · 14 年前

    请原谅我冗长的解释,但我希望尽可能的明确,以期得到尽可能多的有用的反馈我的情况。如果你不耐烦,可以跳到下面的问题。

    解释

    在我目前的工作中,开发是在一种过时的语言中完成的,这种语言与专用DBMS硬连接在一起。该语言以CRUD为中心,本质上是一种光荣的数据库查询/报告/更新语言,有些编程功能是事后附加的。大多数程序都是自顶向下的过程,代码重用很少;更新一个记录通常需要同时更新许多纠缠的、相关的记录,而您只需要“了解”,因为专有数据库没有固有的外键关系。如果一个表需要更新,我们通常必须对源代码进行grep,并更新为该表创建/更新记录并重新编译的每个过程。我可以继续处理其他的烦恼,但不用说,我正在寻找一种方法,尽可能将这些行为抽象为可重用的代码段。

    该语言最近为面向对象的开发增加了一些支持,并且我已经通过最近使用OO构造编写的项目向我的同事演示了可重用代码的好处。然而,我的项目是唯一可能的,因为这是一个罕见的任务,不需要与我们的数据库交互。

    我一直在努力寻找一种方法,用这种语言使用OO技术来创建可重用的代码,但是由于一切都是以数据库为中心的,所以我真正需要的是围绕表设计创建容器类,将大部分数据处理逻辑放入类方法,并将n个相关表合并为1个单一类。这让我想到了ORM框架的概念,在我工作时使用的语言中,它当然是不存在的。

    我什么 发现,这种语言的DBMS可以与专有语言引擎同时运行SQL99引擎,它包括JDBC和ODBC驱动程序。这为我探索迁移策略打开了大门,我认为我们最终需要去那里。由于SQL引擎与旧引擎同时运行,因此我们可以进行增量迁移,在旧代码旁边运行新代码,最终目标是在替换所有旧代码时将数据迁移到“纯”SQL DBMS。

    起初我做了相当多的阅读,并提出Java(使用JPA2为ORM)给我的经理,但我认为我害怕他,因为他认为Java是一个有点重量级的我们的需求。然后,我用JRuby解释器(对ORM使用ActiveRecord或DataMapper)对Ruby进行了更多的挖掘,并重新提出了建议,因为Rails似乎很适合我们将开发重新转换为基于Web的前端,而这正是我们试图用以前笨拙的代码来实现的,当然,因为Abili如果需要,TY与Java交互是一个巨大的能力。

    问题

    1. 几乎所有我读过的书 一直在关注ORM 从类结构开始,并且 创建映射数据库 结构作为第二个过程。 往反方向走吗 (从现有数据库开始 并将类映射到它)非常 奇怪的事情?

    2. 假设问题1=真,如何 灵活的现有ORM框架 如JPA2,ActiveRecord, “不完美”表的数据映射器等 设计?我相信我们必须 对现有的进行重构 桌子设计,但想知道 如果我要承担一项艰巨的任务 在我浪费太多时间在 努力。

    3. 如果有人对 语言+ORM,我很想听 它。必须使用JDBC准备好SQL 或ODBC以适应我们的增量 移民计划。

    如果有人有过类似的工作经验,能指出任何有用的资源(特别是书籍),我将非常感谢!

    1 回复  |  直到 14 年前
        1
  •  1
  •   Pascal Thivent    14 年前

    我所做的关于ORM的几乎所有阅读都集中在从类结构开始,并将创建映射的数据库结构作为第二个过程。换一种方式(从现有的数据库开始并将类映射到它)是一件很奇怪的事情吗?

    不是真的。在处理应用程序的持久层时,有几种方法:

    • 自顶向下 :首先从对象模型和映射开始,然后从该数据派生数据库架构。
    • 自下而上 :首先从数据模型(即数据库架构)开始,然后从表中派生对象模型和映射。
    • 中途出 :从映射开始,生成对象模型和表。
    • 在中间相遇 :您从现有的数据库模式和现有的对象模型开始,开发一个映射来在两个模式之间进行映射(甚至可以引入一个额外的对象层并将现有的对象层桥接起来)。

    自顶向下的方法是最面向对象的,但中间的满足方法可能是最常见的。

    假设问题1==true,现有的ORM框架(如jpa2、activerecord、datamapper等)对于“不完美”的表设计有多灵活?我相信我们将不得不对现有的表设计进行一些重构,但我想知道在我浪费太多时间进行这项工作之前,我是否正在承担一项艰巨的任务。

    我会说JPA不是最灵活的,它不会很好地处理外来的或严重非规范化的模式(从OO的角度来看,结果可能很糟糕)。不通过JPA的访问也可能是一个问题。像ibatis这样的数据映射工具(现在 mybatis )会给你更多的灵活性。

    如果有人对语言+ORM有更好的想法,我很乐意听到。它必须使用JDBC或ODBC准备好SQL,以适应我们的增量迁移计划。

    我知道RoR可以处理现有的数据库,我只是不确定结果会是什么样子。但我在RoR方面的经验还不够,所以我会让专家们详细阐述这一点。

    如果有人有过类似的工作经验,能指出任何有用的资源(特别是书籍),我将非常感谢!

    我建议浏览Scott Ambler website 他的书:

    更多思考的食物: