Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.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 如何在Redis中查询和表示对象/哈希之间的关系_Nosql_Redis_Relationship_Relation - Fatal编程技术网

Nosql 如何在Redis中查询和表示对象/哈希之间的关系

Nosql 如何在Redis中查询和表示对象/哈希之间的关系,nosql,redis,relationship,relation,Nosql,Redis,Relationship,Relation,让我们假设我有一个包含文章和作者的应用程序。它将数据保存在Redis数据库中。文章以散列形式存储,如下所示,以JSON语法表示: { "title" : "My title", "content" : "This is a content", "authorId" : 1} 此外,我的作者由散列表示: { "name": "John Smith", "username" : "jsmith", "password" : "secret", "id" : 1} 问题是,在给定作者id的情况下,

让我们假设我有一个包含文章和作者的应用程序。它将数据保存在Redis数据库中。文章以散列形式存储,如下所示,以JSON语法表示:

{ "title" : "My title", "content" : "This is a content", "authorId" : 1}
此外,我的作者由散列表示:

{ "name": "John Smith", "username" : "jsmith", "password" : "secret", "id" : 1}

问题是,在给定作者id的情况下,如何检索所有文章?Redis中是否有执行此操作的命令?您会手动检索和筛选它们吗?还是我表达这种关系的方式有缺陷?您有什么建议?

在Redis中,没有直接的方法使用字段值作为选择标准来检索哈希。对于当前的数据模型,唯一的方法是检索所有的文章散列,然后丢弃那些不匹配的散列,但这种方法远远不够有效

事实上,你必须自己维护一个索引。因为散列中不能有集合,所以我会使用包含作者文章ID的单独集合。这样,您将拥有作者的哈希:

author_1: { "name": "John Smith", ... "id": 1 }
author_2: { "name": "Jane Doe", ... "id": 2 }
并为此映射设置:

author_1_articles: [1, 3]
author_2_articles: [2]
它映射到这些文章:

article_1: { "title": "My title", ... "authorId": 1 }
article_2: { "title": "Another one", ... "authorId": 2 }
article_3: { "title": "What a story", ... "authorId": 3 }
现在,当你想为某个作者X获取文章时,你只需要获取SMEMBERS author_X_文章,你就会得到文章ID列表

我会使用集合,因为如果你为一个作者多次添加同一篇文章,Redis就会忽略它。因此,您将获得的文章列表将永远不会有重复的文章,并且您可以使用SADD,而无需首先检查该文章是否已在集合中

这听起来可能需要做很多工作,如果您的数据模型很复杂,并且您需要快速创建许多不同的访问模式,那么这将是一件非常困难的事情。您最终要做的是维护自己的索引,对于这些索引,您必须复制数据并使其保持最新。这就是NoSQL的权衡