2013-03-13 88 views
0

要求:我在S3中存儲照片,並希望用戶能夠查找包含他們在網頁上鍵入的關鍵字的所有照片。使用DynamoDB和PHP查詢照片中的關鍵字

我的解決辦法:我已創建2個表: tblPhotos: 主鍵= HashKey:PHOTOID 字段: PHOTOID, S3Loc​​ation

tblKeywords: 主鍵= HashKey(HashID)和RangeKey(關鍵字) Fields: HashID(始終設置爲1), 關鍵字(一個大字符串;關鍵字後跟PhotoID) S3位置

我用下面的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查詢實現記錄過濾的更好方法?我試圖避免掃描效率非常低,雖然我的解決方案雖然工作,但它似乎並不特別優雅!

回答

1

如果你的主要目標是能夠返回所有的照片對於給定的關鍵詞,我認爲下面的模式會更有意義:

HashKey =關鍵字

RangeKey = PHOTOID

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

+0

感謝您的答覆,但我認爲它只會讓我有一個「行」每個主鍵?換句話說,每個關鍵字只有一個記錄。我希望數以百計的photoID擁有相同的關鍵字。除非我錯過了什麼? – SRG 2013-03-13 23:38:34

+0

我應該調用密鑰的第一部分「哈希」而不是「主」(上面編輯)......當你有一個「哈希和範圍類型主鍵」時,第一個哈希值被假定爲有重複。哈希和範圍的組合是唯一的「主鍵」值... – Scrappydog 2013-03-14 20:10:28

+0

啊有趣的 - 我試過它的另一種方式,與PhotoID是哈希鍵和關鍵字是rangekey沒有工作。 1 PhotoID可能有多個關鍵字,所以我需要測試一下,看看它是否可以應對。我會盡力讓你知道,謝謝! – SRG 2013-03-14 20:16:30