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



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

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

那么,有什么更好的方法可以做到这一点吗?

附言:如果我们把徽标和产品分成两个不同的表,所以当我需要一次获得1000个产品时,我需要通过实现客户端级别的连接类型来获得相关的徽标,这也不是一个好的解决方案。

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

接下来,您可以有两个集合——prod用于产品,prodimg用于产品图像。各种产品存储参考产品图像集的ID的列表。产品图像集将每个图像的元数据作为一个单独的记录{uri、名称、标题、宽度、长度…}。如果此图像有任何更改,只需在prodimg中使用该图像的元数据更新一条记录。无需对产品进行任何更改。

在这种情况下,您并不真正需要JOIN功能。您的应用程序可以首先获取prod记录,然后使用包含产品图像的所有ID的bin(images)(每个ID都指prodimg中记录的密钥)。然后,您可以对所有这些操作(读取)发出几个get操作(读取操作),或者如果有多个,则可以对所有操作发出单个批读取操作。Aerospike的延迟使得它将比RDBMS中的等效JOIN更快地返回并扩展得更好。批读取是一种多节点、多核、多线程的操作。由3个多核节点组成的集群具有足够的并行计算能力。

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

最新更新