缓存EAV数据-XML还是NoSQL/MongoDB?
我正在构建一个web应用程序,它在很大程度上依赖于用于存储数据的。这基本上意味着对象的每个属性在大型数据库表中都有自己的行。我正在使用MySQL存储所有内容。这是一个非常简单的例子,我正在存储缓存EAV数据-XML还是NoSQL/MongoDB?,mongodb,caching,entity-attribute-value,nosql,Mongodb,Caching,Entity Attribute Value,Nosql,我正在构建一个web应用程序,它在很大程度上依赖于用于存储数据的。这基本上意味着对象的每个属性在大型数据库表中都有自己的行。我正在使用MySQL存储所有内容。这是一个非常简单的例子,我正在存储 OBJECTS ATTRIBUTES objId | type objId | attribute | value ============= ========================= 1 | fruit 1
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连接执行此操作将非常可怕,因此我正在考虑缓存数据。平均来说,数据库每写一次就有大约300次读取,所以我认为这是缓存的一个很好的候选者
到目前为止,这些是我想出的选择
我很想听听你对此的想法。我只看到两种方式,这两种方式都在评论中提到过 首先,您可以真正迁移到像Mongo这样的面向文档的数据库——这是EAV的合适替代方案。因为它将没有连接和其他逻辑,所以它将非常快速,并且略微扩展。(因此,也许您可以避免使用缓存) 其次,您可以使用特定的缓存工具,如Redis、Mongo或Memcached,将每个查询结果保存一段时间 但我想把我们的注意力转向这个系统的未来。什么是计划加载和缩放? 如果您想减少系统负载,我认为最好的方法是迁移到面向文档的数据库。 或者,如果您希望立即得到结果(缓存数据以供读取),则可以使用缓存工具来访问结果,即使[如果可能]在网络级别(例如nginx support memcached开箱即用)
所以,像往常一样,你应该在一次性成本和连续成本之间找到平衡。PS:我刚刚想起第四种选择。将来我需要在应用程序中添加全文搜索功能,为此我正在考虑使用ApacheLucene。由于我将在每次数据库写入时更新Lucene索引,也许这可以用于与搜索无关的其他读取—例如,仅列出某一类型的所有对象。为什么不简单地使用CLRs内存缓存实现呢?另一个问题是,为什么不简单地删除MySQL服务器存储并转移到可以更好地处理EVA的存储模型,就像您提到的Monogo或RavenDB。@Kolja-转移到MongoDB或RavenDB是我考虑过的一个选项,但我担心重新编码数据访问层所需的时间。此外,该系统是在实际生产使用,使移动数据库更难。然后我会考虑使用MeMeOyCy缓存。它应该是最容易实现的,并且在缓存查找时不需要任何硬盘读/写。它将从您的缓存中删除所有即将过期的处理。您可以轻松地配置要使用的缓存内存量,以便为应用程序找到最佳价值。