0

要件:S3に写真を保存していて、ユーザーがWebページに入力したキーワードを含むすべての写真を検索できるようにしたい。

私の解決策:2つのテーブルを作成しました: tblPhotos: Primary Key = HashKey:PhotoID Fields:PhotoID、S3Loc​​ation

tblKeywords: Primary Key = HashKey(HashID)およびRangeKey(Keyword)フィールド:HashID(常に1に設定)、Keyword(1つの大きな文字列、キーワードの後に​​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 = PhotoID

追加可能なフィールド: S3Name (PhotoID と同じでない場合)

于 2013-03-13T22:28:41.313 に答える