我们正在使用dynamo db作为我们其中一个站点的数据库解决方案。我们将数据存储在dynamo db中,如下面给出的json。
我们有可以属于一个/多个类型的视频,因此我们选择了列表数据类型并将数据存储到其中并使该类型成为GSI(全球二级索引)
我正面临几个问题。
1)当我将类型定义为索引时,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"),
)
),
),
));
在上面的代码中,我正在寻找儿童类型的视频。但如果我不将类型声明为索引,则返回空白并给出错误。同一视频可以属于多种类型。
那么无论如何我可以在列表中搜索或者我是否以正确的方式使用API?总是感谢帮助。
答案 0 :(得分:2)
关于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
上述解决方案存在问题:如果您在一个特定代码中包含数十亿个视频,那么由于哈希未正确分发,您的效果会受到影响。
小提示:您可以为表读取实现缓存机制,这样您就不必每次都查询数据库。