在 NoSQL(Aerospike) 中更新冗余 data/denormalized 数据

Updating Redundant data/denormalized data in NoSQL(Aerospike)

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

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

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

P.S.: 如果我们将 logo 和 Products 分成 2 个不同的 table ,那么当我需要一次获取 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 的延迟如此 return 比 RDBMS 中的等效 JOIN 更快,扩展性更好。批量读取是多节点、多核、多线程操作。 3个多核节点集群,并行计算能力充足

同样,如果您 "need 1000 products at a time" 使用批量读取。在 Java 客户端中是 AerospikeClient.get() with a list of Key objects. In the Python client that's an aerospike.Client.get_many。每个 Aerospike 客户端都具有批量读取功能。