这两个都是可行的,我过去都使用过,但我会使用 API 方法。
快速免责声明:尚不清楚的一件事是这些应用程序的功能有何不同。例如,我可以想象旧的应用程序是处理单个记录的 CRUD 应用程序,而新的应用程序是执行大型复杂聚合查询的报告应用程序。这使得共享数据库(也许)更具吸引力,因为您访问数据的方式重叠非常小。我在下面假设情况并非如此。
无论如何,API方法。首先,坏处:
- 另一个依赖项(旧应用程序)。当它中断时,它会关闭两个应用程序。
- 多一跳来获取数据,因此延迟更高。
- 使用现有代码不如编写新代码有趣。只是。
但另一方面,好的:
对架构更改更具弹性。您的“旧”应用程序的 API 可以进行测试,您可以随心所欲地使用数据库(在旧应用程序的上下文中),并保持您的 API 符合其规范。您的新应用程序不会知道其中的区别,这很好。抽象 FTW。这是“另一个依赖”硬币的反面。
同一点,但从不同的角度来看:在我们共享数据库的方法中,您的架构 + 所有 SQL 实际上就是您的 API,它有两个客户端,旧应用程序和新应用程序。除非您的两个应用程序使用相同的数据做非常不同的事情,否则这绝不是最好的 API。定义太差了。
数据库管理员/仪器更好。假设您弄乱了一些查询并软管您的数据库。是哪个应用程序?这些查询来自哪里?基本上,可以与数据库交互的东西越少越好。相关:在一处优化您的读取查询,而不是两处。
如果您在现有应用程序中使用 RESTful 路由来执行非 API 操作,我猜您的 API 需求将与您现有的控制器代码有很大的重叠。这可能只是将您的数据转换为 JSON 而不是将其传递给视图的问题。Rails 使得使用动作来响应 API 和用户驱动的请求变得非常容易。因此,如果适用的话,这是一个巨大的 DRY 胜利。
如果您发现您的新应用确实需要一些可写性,会发生什么?或者至少可以访问您的旧应用程序不关心的某些字段(也许您使用脚本添加了它)?在共享数据库方法中,这很糟糕。另一方面,只需稍微扩展 API 即可。
基本上,我选择共享数据库方法的唯一方法是我讨厌旧代码并想重新开始。这是可以理解的(我已经做到了),但这不是架构上最合理的选择。
要考虑的第三个选项是在两个应用程序之间共享代码。例如,您可以生成模型代码。现在,您的 API 实际上是一些知道如何与数据库对话的 Ruby 类。更进一步,您可以编写一个 Sinatra 应用程序并将其安装在现有的 Rails 应用程序中并重用它的大部分。然后只需制定路由,使它们看起来像外部世界的独立应用程序。这是否实用显然取决于您的具体情况。
在具体技术方面,Sinatra 和 Rails 都是不错的选择。我倾向于 Rails 用于较大的项目,而 Sinatra 则用于较小的项目,但这只是我。做感觉好的事。