phi*_*lks 7 caching mongodb nosql entity-attribute-value
我正在构建一个Web应用程序,它严重依赖于EAV模式来存储数据.这基本上意味着对象的每个属性在海量数据库表中都有自己的行.我正在使用MySQL存储所有内容.这是我存储的一个非常简单的例子......
OBJECTS ATTRIBUTES
objId | type objId | attribute | value
============= =========================
1 | fruit 1 | color | green
2 | fruit 1 | shape | round
3 | book 2 | color | red
Run Code Online (Sandbox Code Playgroud)
我知道有些人讨厌EAV,但我需要能够在不修改数据库模式的情况下随意添加新的对象属性,到目前为止它对我来说非常有用.
正如我想其他人在使用EAV数据结构构建系统时发现的那样,这种方法的缺点是将多个对象与每个对象的属性一起检索.目前我的应用程序一次只显示10个对象,所以我只查询我的EAV表10次(每个对象一次),它仍然非常快.但是,我想删除此限制并允许一次获取数百个对象.我还希望能够以比我目前更灵活的方式查询对象.
使用SQL连接执行此操作将是可怕的,因此我正在考虑缓存数据.平均而言,数据库每写1次就会获得大约300次读取,所以我认为这是缓存的一个很好的候选者.
到目前为止,这些是我提出的选择......
XML数据库列:每次执行写入时,都会更新包含所有对象属性的对象表中的XML文本列.这可以快速读取数据,但是查询隐藏在数据库表中的XML数据很麻烦.
XML文件:每次执行写入操作时,都会将XML文件写入磁盘,其中包含每个对象及其属性.这样做的好处是我可以使用XQuery来查询对象.
NoSQL(例如MongoDB):也许我应该在像MongoDB这样的无模式数据库上构建系统.重写整个应用程序以使用MongoDB会非常耗时,但令我震惊的是我可以将它用作缓存.因此,例如,每次将数据写入EAV存储时,等效对象将在MongoDB中更新,然后将其用于读取和查询.
最初我认为XML文件是最好的方法,但我可以看到文件变得非常庞大且难以管理.目前我倾向于使用MongoDB.我知道为一个应用程序运行两个数据库服务器似乎很疯狂,但我认为它可以在我的情况下工作.
我很想听听你对此的看法.
小智 0
我只看到两种方式,评论中都提到了这两种方式。
首先,您可以真正迁移到像 Mongo 这样的面向文档的数据库 - 这适合作为 EAV 的替代品。由于它没有 JOIN 和其他逻辑,因此它会非常快并且会稍微扩展。(因此,也许您将能够避免使用缓存)。
其次,您可以使用特定的缓存工具(例如Redis或Mongo或Memcached)将每个查询结果保存一段时间。
但我想把我们的注意力转向这个系统的未来。什么是计划加载和缩放?如果你想减少系统负载,我认为最好的方法是迁移到面向文档的db。或者,如果您想立即获得结果(缓存数据以供读取) - 可以通过使用缓存工具来实现,甚至[如果可能]在网络级别(例如 nginx 支持开箱即用的 memcached)。
因此,像往常一样,您应该在一次性成本和持续成本之间找到平衡。