nosql - 在 NoSQL(Aerospike) 中更新冗余数据/非规范化数据

标签 nosql updates aerospike

我的问题是我遇到了一个问题,我需要更新由于在 NoSQL 中而被非规范化的数据,因为一个数据中的单个更新需要在所有其他冗余数据中更新。

例如:考虑一个电子商务数据库,其中有一个表“Products”,其中包含有关产品的所有详细信息,比方说 name、imageName、LogoImage 现在在这种情况下,各种“产品”表条目的 LogoImage 可以相同,现在我需要更新 LogoImage,所以我需要更新包含给定 LogoImage 的所有字段。这似乎是一个非常糟糕的解决方案

那么有没有更好的方法呢?

P.S.:如果我们将 Logo 和产品分离到 2 个不同的表中,那么当我需要一次获取 1000 个产品时,我需要通过实现客户端级别的连接类型来获取相关 Logo ,这也不是一件好事解决方案。

最佳答案

您是建议使用数据库作为 CDN 并将二进制图像存储在其中吗?在我看来,这不是一个好方法。您应该将该图像存储在像 Amazon Cloudfront 这样的实际 CDN 中,或者像 Amazon S3 这样的简单 CDN 中,或者作为文件存储在您自己的网络服务器中。不管怎样,重点是您应该通过 URI 引用它。在 Aerospike 中,您将存储有关该图像的元数据,而不是图像本身。

接下来,您可以有两组 - prod 用于产品,prodimg 用于产品图像。各种产品存储引用产品图像集的 ID 列表。产品图像集将每个图像的元数据作为单独的记录 { uri, name, title, width, length, ... } 。如果此图像有任何更改,您只需使用 prodimg 中该图像的元数据更新一条记录。无需更改产品的任何内容。

在这种情况下,您实际上并不需要 JOIN 功能。您的应用程序可以先获取 prod 记录,然后使用包含产品所有图像 ID 的 bin (images)(每个都引用记录的键在 prodimg 中)。然后,您可以发出一些获取操作(读取)或单个 batch-read对于所有的人,如果有很多。 Aerospike 的延迟是这样的,这将比 RDBMS 中的等效 JOIN 更快地返回并且扩展性更好。批量读取是多节点、多核、多线程操作。一个由 3 个多核节点组成的集群具有充足的并行计算能力。

同样,如果您“一次需要 1000 个产品”,请使用批量读取。在 Java 客户端中,这是一个 AerospikeClient.get()列表为 Key对象。在 Python 客户端中,这是一个 aerospike.Client.get_many .每个 Aerospike 客户端都具有批量读取功能。

关于nosql - 在 NoSQL(Aerospike) 中更新冗余数据/非规范化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46673705/

相关文章:

linux - 如何在 linux 服务器上对 neo4j 数据进行备份和恢复?

database - Neo4j ......如何获得我的数据的可视化表示?

nosql - 如何在 couchbase 查询中按 json 对象的值对文档进行排序?

ubuntu - 错误 0 升级,0 新安装,0 删除和 474 未升级

c# - 更新与替换的MongoDB含义

aerospike - 看到 memory_used_index_bytes 有 4G 而没有索引

firebase - 如何在 Firebase 中过滤/隐藏属性

ios - 为什么 Xcode 10 在完成剩余 2 分钟时停止向前更新?

linux - aerospike服务启动错误/usr/bin/asd :/lib/x86_64-linux-gnu/libc. so.6: version `GLIBC_2.14' not found (required by/usr/bin/asd)

java - aerospike java 中的乐观锁定