Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新NoSQL(Aerospike)中的冗余数据/非规范化数据_Nosql_Updates_Aerospike - Fatal编程技术网

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

更新NoSQL(Aerospike)中的冗余数据/非规范化数据,nosql,updates,aerospike,Nosql,Updates,Aerospike,我的问题是,我有一个问题,我需要更新由于在NoSQL中而被非规范化的数据,因为一个数据中的单个更新需要在所有其他冗余数据中更新 EP:考虑一个电子商务数据库,其中有一个表“产品”包含了产品的所有细节,比如名字、图像名、Logo图像。 现在在这种情况下,各种“产品”表条目的LogoImage可以是相同的,现在我需要更新LogoImage,因此我需要更新包含给定LogoImage的所有字段。这似乎是一个非常糟糕的解决方案 那么有没有更好的方法呢 备注:如果我们将徽标和产品分为两个不同的表,那么当我一

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

EP:考虑一个电子商务数据库,其中有一个表“产品”包含了产品的所有细节,比如名字、图像名、Logo图像。 现在在这种情况下,各种“产品”表条目的LogoImage可以是相同的,现在我需要更新LogoImage,因此我需要更新包含给定LogoImage的所有字段。这似乎是一个非常糟糕的解决方案

那么有没有更好的方法呢


备注:如果我们将徽标和产品分为两个不同的表,那么当我一次需要获得1000个产品时,我需要通过实现客户端连接类型来获得相关徽标,这也不是一个好的解决方案。

您建议使用数据库作为CDN,并在其中存储二进制图像?在我看来,这不是一个好办法。您应该将该映像作为文件存储在实际的CDN(如AmazonCloudFront)中,或简单的CDN(如AmazonS3)中,或您自己的Web服务器中。无论哪种情况,关键是您应该通过URI引用它。在Aerospike中,您将存储关于该图像的元数据,而不是图像本身

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

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


同样,如果您“一次需要1000个产品”,请使用批读取。在Java客户机中,这是一个包含对象列表的。在Python客户机中,这是一个。每个Aerospike客户端都具有批读取功能

.你好,Ronen,谢谢你的帮助,我只在products表中存储图像的URI。另外,您告诉使用的方式不是一个缓慢的解决方案吗?另外,可以使用Aerospike获取可能随时更新的数据吗?因为大多数数据将采用非规范化形式,这将导致冗余,并且由于非规范化而改变包含相同数据的bin值将需要在Aerospike中进行多次更新/操作。或者有更好的方法吗?Aerospike比RDBMS快10-100倍。您一次获取多个记录的速度会更快。您的RDBMS支持的应用程序已经非规范化为主要的单表PK访问,或者可能是子表(用户和车辆)的连接。没有人有使用第三范式的web应用程序,对吗?由于复杂的数据类型列表和映射,Aerospike不必进行大多数连接。实际上,我建议在列表中使用ID,这类似于外键,因此只需调整一个位置(
prodimg
)。Aerospike是一个真正的分布式数据库,而不是缓存。感谢Ronen的帮助。不客气。如果答案解决了你的问题,请投票表决。它会消除很多困惑。但是现在我没有足够的声誉去投票给答案,因为我是一个新手。