0

要求:我将照片存储在 S3 中,并希望用户能够查找包含他们在网页上键入的关键字的所有照片。

我的解决方案:我创建了 2 个表: tblPhotos: Primary Key=HashKey: PhotoID Fields: PhotoID, S3Loc​​ation

tblKeywords: Primary Key=HashKey (HashID) 和 RangeKey (Keyword) 字段:HashID(始终设置为 1)、Keyword(一大串;关键字后跟 PhotoID) S3Loc​​ation

我正在使用以下 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 查询实现这种记录过滤的更好方法吗?我试图避免扫描,因为它的效率非常低,尽管我上面的解决方案在它工作时似乎并不是特别优雅!

4

1 回答 1

1

如果您的主要目标是能够返回给定关键字的所有照片,我认为以下模式会更有意义:

HashKey = 关键字

RangeKey = 照片ID

其他可能的字段:S3Name(如果它与 PhotoID 不同)

于 2013-03-13T22:28:41.313 回答