Rails Rails 中两个项目用一个数据库

glorySpring · 2014年06月09日 · 最后由 ywjno 回复于 2014年06月17日 · 4458 次阅读

弱弱的问一下,共用数据库我是知道的,能共用 model 嘛? 就是有两个项目 A, B. 现在在 A 里面创建完整的 MVC,然后在 B 项目里面只创建 VC,使用 A 里面的 M. 有这样用的嘛?或者有什么类似的用法呢?

做成 Gem?硬链接?改成 API?

最好的方法是给 A 的 models 做 API 并设置 localhost 路由,B 通过内部路由访问 A 的 API 进行读写。这样相互独立,可维护,可扩展。

千万不要共用数据库,或用复杂的手法调用 A 的 models。

git submodel

我能说我们公司几十个项目共用数据库嘛

ln -nfs /pathA/app/models /pathB/app/models

直接文件硬链接 哈哈

做成 api 吧。。。。

用 api 正解,否则蛋疼一周年

做成 API 看起来是高大上,其实各种麻烦。 把 models 抽出来放入一个 git submodule。 两边都同步他就行了。

#4 楼 @iBachue 拜托大哥...说说吧

#10 楼 @ywencn 那这个需要怎么同步呢?

#9 楼 @layerssss 这...api 确实我也写了...但是还是不太清楚太明确的操作方式,这个我再研究一下,回头跟你们汇报成果。

#5 楼 @azhao 这个是文件链接?还真没有这么用过...谢谢。我看看。

#2 楼 @billy 最好不要公用数据库,我也是这么想的...首先先谢了,你的方法我正在看...不过有什么例子可以看一下嘛?这边资源太匮乏了,光我自己找优点没头绪。我先看着,回头不明白的再来找你们商量。

#3 楼 @smallX 恩恩,这个 也看过了,谢谢,是一个不错的选择...

可以把一个项目建在另外一个项目中,这样可以各种公用。如果不这样就做成接口吧

#17 楼 @317583395 ok,我想了一下还是做接口吧。谢谢....

git submodule

#7 楼 @billy 结论就是不要共用 model 的代码 一开始挺高兴,后来全成了负担 你可以把复杂的数据库逻辑包装在 Procedure 里,然后每个项目各自维护自己所需要的 model 代码,各个项目分工好的话 不会有太多冗余的,但是负担大大降低了呢。

#9 楼 @layerssss 只蛋疼一周年的意思是,第二年项目失败关闭了么

@iBachue 共用数据库可能比共用 models 的问题只多不少。

问题一:validation

举个例子,假设现在好几个类似 redmine 的 rails app 同时跑在一个数据库上。其中有一个表是 issues,一个 app 要求 issue 必须 50 个字,一个只要求 20 个字。因为是不同 team 在维护 models,这个很可能出现。那么好了,一个 app 写入了 20 个字的 issue, 完全没有问题。另一个 50 字的 app 可以读到这个 issue, 但当用户要修改它时,bingo! invalid! 怎么办?

问题二:数据一致性

假设 app1 的 User model 会有一个 callback, 自动把用户名变成小写并存入。但 app2 没有这个,那么存入数据库的用户名就会有大有小,造成不一致及各种麻烦。

共用数据库的情景下这些问题的唯一解决方法就是 team 之间互相沟通(指责?),但没有任何代码和机制保证不会出问题。

#22 楼 @billy 问题一的解决方案是数据库 constraints 问题二的解决方案是数据库 trigger 既然是数据库共享 很多逻辑就尽可能放在数据库层面了。

@iBachue ActiveRecord 好不容易把这些东西从数据库里拿出来,做到简单易用可扩展可移植少依赖。你倒好,又费同样的劲全给放回去了。

#24 楼 @billy 我不认为数据库完整性由应用来保证是什么好的 Practice AR 只是提供人性化的反馈 数据完整性由数据库自己保证,无论是架构还是性能都是最好的。

@iBachue 如果大量依靠 SQL 语言来写应用,那真没必要用 Rails 或其他类似框架了,直接 PHP 加一个 template engine 就可以搞定需求了,速度还快。

还有一个情景。假设有个需求变更,需要更改或加减某些 attributes。如果用 API 的话,作为维护 API 的人,我可以轻松做一个 version,或者看实际情况用 ruby 写出向下兼容的 API。但如果是共享数据库呢?谁可以决定?需不需要所有 team members 一起开个会看看怎么改 db?

#21 楼 @kgen 第二年任何人类都不再忍得住了,便最终还是用 API 来解耦了。

#27 楼 @layerssss API 解耦是公主和王子从此幸福地生活在一起的结局!

#26 楼 @billy 我不反对 API 是个比共享数据库更好的办法 如果性能允许,并且 API 也恰好设计得满足所有人的要求,并且 API 开发的速度从来不会成为其他项目的瓶颈,那当然更好。共享数据库是一种妥协式的设计,只是比共享 Model 相对更好些,相对于设计一套完整的 API 系统更节约时间,也更简单易用,适合项目早期快速开发,没有太多技术负债的时候,一般由 DBA 负责 Schema 的修改,如果要修改或者删除 Column,当然要那些依赖这个 Column 的项目做好准备,只是一般不会影响太多。当然,毫无疑问的,API 总是架构演变的最终结果。

@iBachue 谢谢你的探讨,我也加多了很多理解。

@iBachue ,我觉得,比较多的场景是有一个项目 A 是先大致成熟的,然后其他项目 B,C,D 等才会考虑共享数据库或 API,根据 A 的情况,大致有以下几种场景:

一、A 是打算不久后被替代的老项目。

这种情况我觉得共享数据库比较合适。A 可以暂停开发,只解决 bugs。开发精力放到新项目。API 也可以滞后甚至不需要。

二、A 是在用的项目,并且期待继续发展。

这种情况我觉得共享数据库就不合适了。而且也不需要立刻设计一套完整的 API 系统才能做新项目。可以根据 B,C 的需求先在 A 里面加上必需的 API 以及内部路由。需要什么就开发什么。等成熟后再考虑是否迁出 A 里面部分或全部的 API,或者不迁也可以。

三、A,B,C 都是新的,同时设计的

这种情况我觉得根据需要可以直接从头开始设计一些独立的服务,比如用户、通知等等。让 A,B,C 等消费。

#31 楼 @billy 嗯 通常 A 作为初创项目也通常是核心项目 二的发生概率会较高 让 B C 调用 A 的 API 这种事我们也做过 后来发现的问题 一是 A 性能撑不住了,这个可以当然通过横向扩展来解决 二是 A 作为核心项目开发力度通常比较大 还要满足 B 和 C 的需求 最后成了瓶颈 这个问题我们至今都没有解决。。 还有一种场景是 B 和 C 是从 A 项目分裂出来的 在这种情况下 如果是共享数据库的话开发速度就快了很多。

做成 Gem,做成 API 都在用,各有各蛋疼的地方

我倒是碰到同一个服务里面怎么用两个数据库的问题(不要求同时处理两数据库的事务

@ywjno 你把数据库和 API 看成同样的东西就好了啊。MongoLab, 还有 Heroku 里面那些 MongoDB 的服务不都是 API 的形式?

#35 楼 @billy 那就需要我又要搭建一个 server 来做,而我想弄的是同一个 server 用两个数据源

需要 登录 后方可回复, 如果你还没有账号请 注册新账号