缓存EAV数据 - XML还是NoSQL / MongoDB?

时间:2012-01-25 09:45:39

标签: mongodb caching entity-attribute-value nosql

我正在构建一个非常依赖EAV pattern来存储数据的网络应用。这基本上意味着对象的每个属性在海量数据库表中都有自己的行。我正在使用MySQL存储所有内容。这是我正在存储的一个非常简化的例子......

OBJECTS              ATTRIBUTES

objId | type         objId | attribute | value
=============        =========================
1     | fruit        1     | color     | green 
2     | fruit        1     | shape     | round
3     | book         2     | color     | red

我知道有些人讨厌EAV,但我需要能够在不修改数据库架构的情况下随意添加新的对象属性,到目前为止它对我来说非常有用。

正如我想其他人在使用EAV数据结构构建系统时发现的,这种方法的缺点是多个对象与每个对象的属性一起被检索。目前我的应用程序一次只显示10个对象,所以我只查询我的EAV表10次(每个对象一次),它仍然非常快。但是,我想删除此限制并允许一次获取数百个对象。我还希望能够以比我目前更灵活的方式查询对象。

使用SQL连接执行此操作将是可怕的,因此我正在考虑缓存数据。平均而言,数据库每写1次就会获得大约300次读取,所以我认为这是缓存的一个很好的候选者。

到目前为止,这些是我提出的选择......

  1. XML数据库列:每次执行写入操作时,都要更新 objects 表中包含所有对象属性的XML文本列。这可以快速读取数据,但是查询隐藏在数据库表中的XML数据很麻烦。

  2. XML文件:每次执行写入操作时,都会将XML文件写入磁盘,其中包含每个对象及其属性。这样做的好处是我可以使用XQuery来查询对象。

  3. NoSQL(例如MongoDB):也许我应该在像MongoDB这样的无模式数据库上构建系统。重写整个应用程序以使用MongoDB会非常耗时,但令我震惊的是我可以将它用作缓存。因此,例如,每次将数据写入EAV存储时,等效对象将在MongoDB中更新,然后将用于读取和查询。

  4. 最初我认为XML文件是最好的方法,但我可以看到文件变得非常庞大且难以管理。目前我倾向于使用MongoDB。我知道为一个应用程序运行两个数据库服务器似乎很疯狂,但我认为它可以在我的情况下工作。

    我很想听听你对此的看法。

1 个答案:

答案 0 :(得分:0)

我只看到两种方式,评论中都提到了这两种方式。

首先,您可以真正迁移到像Mongo这样的面向文档的数据库-适合作为EAV的替代。由于将不再需要JOIN和其他逻辑,因此它会非常快且略有扩展。 (因此,也许您可​​以避免使用缓存)。

第二,您可以使用Redis或Mongo或Memcached等特定的缓存工具来保存每个查询结果一段时间。

但是我想将目光转向这个系统的未来。计划的加载和缩放是什么? 如果要减少系统负载,我认为最好的方法是迁移到面向文档的数据库。 或者,如果您希望立即获得结果(缓存数据以供读取),则可以使用缓存工具,甚至在网络级别上也可以(例如,nginx支持开箱即用的memcached)。

因此,与往常一样,您应该在一次性费用和连续费用之间找到平衡。