我的问题是我遇到了一个问题,我需要更新由于在 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/