Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
缓存EAV数据-XML还是NoSQL/MongoDB?_Mongodb_Caching_Entity Attribute Value_Nosql - Fatal编程技术网

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

缓存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

我正在构建一个web应用程序,它在很大程度上依赖于用于存储数据的。这基本上意味着对象的每个属性在大型数据库表中都有自己的行。我正在使用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连接执行此操作将非常可怕,因此我正在考虑缓存数据。平均来说,数据库每写一次就有大约300次读取,所以我认为这是缓存的一个很好的候选者

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

  • XML数据库列:每次执行写入操作时,更新对象表中包含所有对象属性的XML文本列。这将有助于快速读取数据,但查询隐藏在数据库表中的XML数据很麻烦

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

  • NoSQL(例如MongoDB):也许我应该在MongoDB这样的无模式数据库上构建系统。重新编写整个应用程序以使用MongoDB将非常耗时,但我突然想到可以将其用作缓存。例如,每次数据写入EAV存储时,MongoDB中的等效对象都会被更新,然后用于读取和查询

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


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

    我只看到两种方式,这两种方式都在评论中提到过

    首先,您可以真正迁移到像Mongo这样的面向文档的数据库——这是EAV的合适替代方案。因为它将没有连接和其他逻辑,所以它将非常快速,并且略微扩展。(因此,也许您可以避免使用缓存)

    其次,您可以使用特定的缓存工具,如Redis、Mongo或Memcached,将每个查询结果保存一段时间

    但我想把我们的注意力转向这个系统的未来。什么是计划加载和缩放? 如果您想减少系统负载,我认为最好的方法是迁移到面向文档的数据库。 或者,如果您希望立即得到结果(缓存数据以供读取),则可以使用缓存工具来访问结果,即使[如果可能]在网络级别(例如nginx support memcached开箱即用)


    所以,像往常一样,你应该在一次性成本和连续成本之间找到平衡。

    PS:我刚刚想起第四种选择。将来我需要在应用程序中添加全文搜索功能,为此我正在考虑使用ApacheLucene。由于我将在每次数据库写入时更新Lucene索引,也许这可以用于与搜索无关的其他读取—例如,仅列出某一类型的所有对象。为什么不简单地使用CLRs内存缓存实现呢?另一个问题是,为什么不简单地删除MySQL服务器存储并转移到可以更好地处理EVA的存储模型,就像您提到的Monogo或RavenDB。@Kolja-转移到MongoDB或RavenDB是我考虑过的一个选项,但我担心重新编码数据访问层所需的时间。此外,该系统是在实际生产使用,使移动数据库更难。然后我会考虑使用MeMeOyCy缓存。它应该是最容易实现的,并且在缓存查找时不需要任何硬盘读/写。它将从您的缓存中删除所有即将过期的处理。您可以轻松地配置要使用的缓存内存量,以便为应用程序找到最佳价值。