gpt4 book ai didi

mongodb - 缓存 EAV 数据 - XML 或 NoSQL/MongoDB?

转载 作者:IT老高 更新时间:2023-10-28 13:23:45 25 4
gpt4 key购买 nike

我正在构建一个严重依赖 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 中的等效对象都会更新,然后用于读取和查询。

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

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

最佳答案

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

首先,您可以真正迁移到像 Mongo 这样的面向文档的数据库 - 这适合作为 EAV 的替代品。因为它不会是 JOIN 和其他逻辑,所以它会非常快并且略微缩放。 (所以,也许您可​​以避免使用缓存)。

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

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

因此,像往常一样,您应该在一次性成本和持续成本之间找到平衡。

关于mongodb - 缓存 EAV 数据 - XML 或 NoSQL/MongoDB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9000546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com