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

时间:2017-10-10 18:38:25

标签: nosql updates aerospike

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

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

那么还有更好的方法吗?

PS:如果我们将徽标和产品分成两个不同的表,那么当我需要一次获得1000个产品时,我需要通过实现客户端级别的连接类型来获取相关的徽标,这也不是一个好的溶液

1 个答案:

答案 0 :(得分:2)

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

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

在这种情况下,你真的不需要JOIN功能。您的应用程序可以首先获取prod记录,并使用包含产品图像所有ID的bin(images)(每个都引用prodimg中记录的键)。然后,如果有很多,您可以为所有这些操作发出一些get操作(读取)或单个batch-read。 Aerospike的延迟使得它的返回速度更快,并且比RDBMS中的等效JOIN更好。批量读取是一种多节点,多核,多线程操作。 3个多核节点的集群具有充足的并行计算能力。

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