将传统的EAV模式转换为Mongo或Couch

如何解决将传统的EAV模式转换为Mongo或Couch

| 假设我有一个遗留应用程序,由于各种原因,以前的开发人员决定必须具有任意灵活的架构,然后他们又重新发明了Entity-Attribute-Value模型。他们实际上是在尝试建立文档存储库,Mongo或Couch之类的工具现在更适合当今世界,但以前的团队并不知道或不知道。 为了保持竞争力,我们需要建立更强大的方法查询和分析系统中的信息。基于大量的属性和各种属性,与逐步将系统重构为更具关系的架构相比,map / reduce似乎更适合我们的问题。 原始源数据库具有数百万个文档,但是只有少量不同的文档类型。不同文档类型之间存在一些共性。 从大规模的EAV实现(例如MysqL)迁移到面向文档的商店(如Mongo或Couch)的有效策略是什么? 我当然可以想像出一种解决此问题的方法,但是我真的很想看看一个教程或战争故事,以向已经解决了此类问题的人学习。 有什么策略可以很好地进行这种转换?你学了什么课?我应该避免什么陷阱?您如何处理仍希望能够与现有数据库交互的旧版应用程序?     

解决方法

Couch的首次使用是在我编写了Ruby和Postgres Web搜寻器之后(定向mp3博客的搜寻以构建推荐引擎)。 当我尝试记录ID3元数据,音频签名等时,关系模式变得非常粗糙,检测重叠并且进行重复数据删除。它起作用了,但是很慢。太慢了,我开始将JSON API行作为blob字段缓存到相应的主要ActiveRecord对象上。 我有一个选择:深入学习Postgres性能调整,或者转向横向方法。因此,我使用Nutch和Hadoop扩展了网络,并使用PipeMapper使用Ruby / Hpricot解析页面。因此,我能够重用我所有的解析器代码,并将其从保存为规范化数据库更改为保存为JSON。我编写了一个小库来处理JSON和REST URL终结点,称为CouchRest,用于将Hpricot结果保存到CouchDB中。 对于该项目,我只是在单个EC2节点上运行了Couch,并在其中填充了一个小的6节点Hadoop集群。只有当我开始构建爬虫数据的浏览界面时,我才真正对查询功能感到满意。 事实证明,我非常灵活,特别适合OLTP应用程序,我很快就在我的所有项目中开始使用它,并最终与两名创建者围绕该技术成立了一家公司。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?