要求:我在S3中存储照片,并希望用户能够查找包含他们在网页上输入的关键字的所有照片。
我的解决方案:我创建了2个表: 的 tblPhotos: 主键= HashKey:PhotoID 领域: PHOTOID, S3Location
tblKeywords: 主键= HashKey(HashID)和RangeKey(关键字) 领域: HashID(始终设置为1), 关键字(一个大字符串;关键字后跟PhotoID) S3Location
我正在使用以下php代码查找包含我的关键字的所有记录:
$table_name = 'tblKeywords';
$keywordresponse = $dynamodb->query(array(
'TableName' => $table_name,
'HashKeyValue' => array(AmazonDynamoDB::TYPE_STRING => '1'),
'RangeKeyCondition' => array(
'ComparisonOperator' => AmazonDynamoDB::CONDITION_BEGINS_WITH,
'AttributeValueList' => array(
array(AmazonDynamoDB::TYPE_STRING => $_GET['sSearch'])
),
)
));
if ($keywordresponse->isOK())
{
foreach ($keywordresponse->body->Items as $item)
{
$aaData[] = array(
'Keyword' => (string) $item->Keyword->{AmazonDynamoDB::TYPE_STRING},
'S3Location' => (string) $item->S3Location->{AmazonDynamoDB::TYPE_STRING}
);
}
echo json_encode(array('keywordstatus' => 1, 'aaData' => $aaData));
}
else
{
echo json_encode(array('keywordstatus' => 0));
}
正如您所看到的,我正在将sSearch作为关键字来过滤结果。我的问题是,你知道使用DynamoDB查询实现这种记录过滤的更好方法吗?我试图避免扫描效率非常低,虽然我的解决方案虽然有效但看起来并不是特别优雅!
答案 0 :(得分:1)
如果您的主要目标是能够返回给定关键字的所有照片,我认为以下架构会更有意义:
HashKey =关键字
RangeKey = PhotoID
其他可能的字段:S3Name(如果它与PhotoID不同)