在dynamodb aws中搜索列表数据类型
Search in list data type in dynamo db aws
我们正在使用 dynamo db 作为我们网站之一的数据库解决方案。我们按照下面给定的 json.
将数据存储在发电机数据库中
我们有属于one/many流派的视频,所以我们选择了列表数据类型并将数据存储到其中,并将流派制作为GSI(全球二级索引)
我面临几个问题。
1) 当我将genre定义为索引时,aws只提供了三种数据类型(字符串、二进制、数字),不允许我们存储列表类型的数据。它给出了意外的数据类型错误。
2) 如果我不定义为索引,则不允许获取数据。 DynamoDB 要求哈希键,这在我的情况下是不可能的,因为我正在获取不应依赖于哈希键(主键)的列表。
{
"description": "********",
"genre": [
"Kids",
"Documentary"
],
"language": "******",
"status": "0",
"thumb_url": "******",
"title": "******",
"uploaded_by": "****** ",
"url": "******",
"video_id": 1330051052
}
获取数据的代码
$DynamoDbClient = AWS::get('DynamoDb');
$result = $DynamoDbClient->query(array(
'TableName' => 'videos',
'IndexName' => 'genre-index',
'AttributesToGet' => array('video_id', 'language', 'description'),
'KeyConditions' => array(
// Key attribute
// This is non-key attribute
'genre' => array(
'ComparisonOperator' => 'EQ',
'AttributeValueList' => array(
array("S" => "Kids"),
)
),
),
));
在上面的代码中,我正在寻找儿童类型的视频。但它 returns 空白,如果我不将流派声明为索引,则会出错。同一个视频可以属于多个流派。
那么我是否可以在列表中搜索,或者我没有以正确的方式使用 API?始终感谢您的帮助。
关于 NoSQL 的一个问题是它并不适用于所有地方,但我的客户也遇到过类似情况,这是我的解决方案:
videoMaster (videoId(hash), desc, link ..etc)
tagDetail (tagId(hash), videoId(Range))
现在可以通过tagId(kids, study..etc) 查询得到特定标签的所有视频
您在 tagDetail 中的数据类似于:
kids -> video1
kids -> video2
Education -> video1
Education -> video3
上述解决方案的问题:如果您在一个特定标签中有数十亿个视频,那么您的性能将受到影响,因为哈希分布不正确。
小提示:你可以为你的table读取实现缓存机制,这样你就不必每次都查询你的数据库了。
我们正在使用 dynamo db 作为我们网站之一的数据库解决方案。我们按照下面给定的 json.
将数据存储在发电机数据库中我们有属于one/many流派的视频,所以我们选择了列表数据类型并将数据存储到其中,并将流派制作为GSI(全球二级索引)
我面临几个问题。
1) 当我将genre定义为索引时,aws只提供了三种数据类型(字符串、二进制、数字),不允许我们存储列表类型的数据。它给出了意外的数据类型错误。
2) 如果我不定义为索引,则不允许获取数据。 DynamoDB 要求哈希键,这在我的情况下是不可能的,因为我正在获取不应依赖于哈希键(主键)的列表。
{
"description": "********",
"genre": [
"Kids",
"Documentary"
],
"language": "******",
"status": "0",
"thumb_url": "******",
"title": "******",
"uploaded_by": "****** ",
"url": "******",
"video_id": 1330051052
}
获取数据的代码
$DynamoDbClient = AWS::get('DynamoDb');
$result = $DynamoDbClient->query(array(
'TableName' => 'videos',
'IndexName' => 'genre-index',
'AttributesToGet' => array('video_id', 'language', 'description'),
'KeyConditions' => array(
// Key attribute
// This is non-key attribute
'genre' => array(
'ComparisonOperator' => 'EQ',
'AttributeValueList' => array(
array("S" => "Kids"),
)
),
),
));
在上面的代码中,我正在寻找儿童类型的视频。但它 returns 空白,如果我不将流派声明为索引,则会出错。同一个视频可以属于多个流派。
那么我是否可以在列表中搜索,或者我没有以正确的方式使用 API?始终感谢您的帮助。
关于 NoSQL 的一个问题是它并不适用于所有地方,但我的客户也遇到过类似情况,这是我的解决方案:
videoMaster (videoId(hash), desc, link ..etc)
tagDetail (tagId(hash), videoId(Range))
现在可以通过tagId(kids, study..etc) 查询得到特定标签的所有视频
您在 tagDetail 中的数据类似于:
kids -> video1
kids -> video2
Education -> video1
Education -> video3
上述解决方案的问题:如果您在一个特定标签中有数十亿个视频,那么您的性能将受到影响,因为哈希分布不正确。
小提示:你可以为你的table读取实现缓存机制,这样你就不必每次都查询你的数据库了。