Как сделать подкачку страниц с simpledb?

Я выбрал бы varchar, если столбец не хранит фиксированное значение как Американский Государственный код - который является всегда 2 символами долго, и список допустимого кода штатов США часто не изменяется:).

В любом случае, даже как хранение хешированного пароля (который является фиксированной длиной), я выбрал бы varchar.

, Почему - символьный столбец типа всегда выполняется с пробелами, который делает для столбца my_column определенный как символ (5) со значением 'ABC' внутри comparation:

my_column = 'ABC' -- my_column stores 'ABC  ' value which is different then 'ABC'

ложь.

Этот функция могла привести ко многим раздражающим ошибкам во время разработки и делает тестирование тяжелее.

10
задан royco 25 November 2009 в 19:17
поделиться

3 ответа

При переходе на следующую страницу вы можете иметь возможность упростить вариант использования, разрешив только «следующую страницу», а не произвольное разбиение на страницы. Вы можете сделать это в SimpleDB с помощью предложения LIMIT:

SELECT title, summary, votecount FROM posts WHERE userid = '000022656' LIMIT 25

Вы уже знаете, как обрабатывать NextToken, но если вы используете эту тактику, вы можете поддерживать «предыдущую страницу», сохраняя цепочку навигации следующих токенов (например, в веб-сеанс) и повторно выполнив запрос с предыдущим NextToken, а не с последующим.

Однако, общий случай обработки произвольной разбивки на страницы в SimpleDB одинаков для предыдущего и следующего. В общем случае пользователь может щелкнуть произвольный номер страницы, например 5, никогда не посещая страницу 4 или 6.

Вы обрабатываете это в SimpleDB, используя тот факт, что NextToken требует, чтобы только предложение WHERE было таким же работать правильно. Таким образом, вместо того, чтобы запрашивать каждую страницу последовательно, вытягивая все промежуточные элементы, вы обычно можете сделать это в два этапа.

  1. Задайте свой запрос, указав предельное значение того, где должна начинаться желаемая страница, и количество SELECT (*) вместо фактических атрибутов, которые вы хотите.
  2. Используйте NextToken из шага 1, чтобы получить фактические данные страницы, используя желаемые атрибуты и размер страницы в качестве LIMIT

Так в псевдокоде:

int targetPage, pageSize;
...
int jumpLimit = pageSize * (targetPage - 1);
String query = "SELECT %1 FROM posts WHERE userid = '000022656' LIMIT %2";
String output = "title, summary, votecount";
Result temp = sdb.select(query, "count(*)", jumpLimit);
Result data = sdb.select(query, output, pageSize, temp.getToken());

Где% 1 и% 2 - это подстановки строк, а «sdb. Выбрать()" - это вымышленный метод, который включает код подстановки String вместе с вызовом SimpleDB.

Сможете ли вы выполнить это за два вызова SimpleDB (как показано в коде), будет зависеть от сложности вашего предложения WHERE и размера вашего набора данных. Приведенный выше код упрощен тем, что временный результат мог вернуть частичный счет, если для выполнения запроса потребовалось более 5 секунд. Вы действительно хотели бы поместить эту строку в цикл, пока не будет достигнут правильный счет. Чтобы сделать код более реалистичным, я помещу его в методы и избавлюсь от подстановки строк:

private Result fetchPage(String query, int targetPage)
{
    int pageSize = extractLimitValue(query);
    int skipLimit = pageSize * (targetPage - 1);
    String token = skipAhead(query, skipLimit);
    return sdb.select(query, token);
}

private String skipAhead(String query, int skipLimit)
{
    String tempQuery = replaceClause(query, "SELECT", "count(*)");
    int accumulatedCount = 0;
    String token = "";
    do {
        int tempLimit = skipLimit - accumulatedCount;
        tempQuery = replaceClause(tempQuery , "LIMIT", tempLimit + "");
        Result tempResult = sdb.select(query, token);
        token = tempResult.getToken();
        accumulatedCount += tempResult.getCount();
    } while (accumulatedCount < skipLimit);
    return token;
}

private int extractLimitValue(String query) {...}
private String replaceClause(String query, String clause, String value){...}

Это общая идея без обработки ошибок, она работает для любой произвольной страницы, за исключением страницы 1.

Сможете ли вы выполнить это за два вызова SimpleDB (как показано в коде), будет зависеть от сложности вашего предложения WHERE и размера вашего набора данных. Приведенный выше код упрощен тем, что временный результат мог вернуть частичный счет, если для выполнения запроса потребовалось более 5 секунд. Вы действительно хотели бы поместить эту строку в цикл, пока не будет достигнут правильный счет. Чтобы сделать код более реалистичным, я помещу его в методы и избавлюсь от подстановки строк:

private Result fetchPage(String query, int targetPage)
{
    int pageSize = extractLimitValue(query);
    int skipLimit = pageSize * (targetPage - 1);
    String token = skipAhead(query, skipLimit);
    return sdb.select(query, token);
}

private String skipAhead(String query, int skipLimit)
{
    String tempQuery = replaceClause(query, "SELECT", "count(*)");
    int accumulatedCount = 0;
    String token = "";
    do {
        int tempLimit = skipLimit - accumulatedCount;
        tempQuery = replaceClause(tempQuery , "LIMIT", tempLimit + "");
        Result tempResult = sdb.select(query, token);
        token = tempResult.getToken();
        accumulatedCount += tempResult.getCount();
    } while (accumulatedCount < skipLimit);
    return token;
}

private int extractLimitValue(String query) {...}
private String replaceClause(String query, String clause, String value){...}

Это общая идея без обработки ошибок, она работает для любой произвольной страницы, за исключением страницы 1.

Сможете ли вы выполнить это за два вызова SimpleDB (как показано в коде), будет зависеть от сложности вашего предложения WHERE и размера вашего набора данных. Приведенный выше код упрощен тем, что временный результат мог вернуть частичный счет, если для выполнения запроса потребовалось более 5 секунд. Вы действительно хотели бы поместить эту строку в цикл, пока не будет достигнут правильный счет. Чтобы сделать код более реалистичным, я помещу его в методы и избавлюсь от подстановки строк:

private Result fetchPage(String query, int targetPage)
{
    int pageSize = extractLimitValue(query);
    int skipLimit = pageSize * (targetPage - 1);
    String token = skipAhead(query, skipLimit);
    return sdb.select(query, token);
}

private String skipAhead(String query, int skipLimit)
{
    String tempQuery = replaceClause(query, "SELECT", "count(*)");
    int accumulatedCount = 0;
    String token = "";
    do {
        int tempLimit = skipLimit - accumulatedCount;
        tempQuery = replaceClause(tempQuery , "LIMIT", tempLimit + "");
        Result tempResult = sdb.select(query, token);
        token = tempResult.getToken();
        accumulatedCount += tempResult.getCount();
    } while (accumulatedCount < skipLimit);
    return token;
}

private int extractLimitValue(String query) {...}
private String replaceClause(String query, String clause, String value){...}

Это общая идея без обработки ошибок, она работает для любой произвольной страницы, за исключением страницы 1.

Приведенный выше код упрощен тем, что временный результат мог вернуть частичный счет, если для выполнения запроса потребовалось более 5 секунд. Вы действительно хотели бы поместить эту строку в цикл, пока не будет достигнут правильный счет. Чтобы сделать код более реалистичным, я помещу его в методы и избавлюсь от подстановки строк:

private Result fetchPage(String query, int targetPage)
{
    int pageSize = extractLimitValue(query);
    int skipLimit = pageSize * (targetPage - 1);
    String token = skipAhead(query, skipLimit);
    return sdb.select(query, token);
}

private String skipAhead(String query, int skipLimit)
{
    String tempQuery = replaceClause(query, "SELECT", "count(*)");
    int accumulatedCount = 0;
    String token = "";
    do {
        int tempLimit = skipLimit - accumulatedCount;
        tempQuery = replaceClause(tempQuery , "LIMIT", tempLimit + "");
        Result tempResult = sdb.select(query, token);
        token = tempResult.getToken();
        accumulatedCount += tempResult.getCount();
    } while (accumulatedCount < skipLimit);
    return token;
}

private int extractLimitValue(String query) {...}
private String replaceClause(String query, String clause, String value){...}

Это общая идея без обработки ошибок, она работает для любой произвольной страницы, за исключением страницы 1.

Приведенный выше код упрощен тем, что временный результат мог вернуть частичный счет, если для выполнения запроса потребовалось более 5 секунд. Вы действительно хотели бы поместить эту строку в цикл, пока не будет достигнут правильный счет. Чтобы сделать код более реалистичным, я помещу его в методы и избавлюсь от подстановки строк:

private Result fetchPage(String query, int targetPage)
{
    int pageSize = extractLimitValue(query);
    int skipLimit = pageSize * (targetPage - 1);
    String token = skipAhead(query, skipLimit);
    return sdb.select(query, token);
}

private String skipAhead(String query, int skipLimit)
{
    String tempQuery = replaceClause(query, "SELECT", "count(*)");
    int accumulatedCount = 0;
    String token = "";
    do {
        int tempLimit = skipLimit - accumulatedCount;
        tempQuery = replaceClause(tempQuery , "LIMIT", tempLimit + "");
        Result tempResult = sdb.select(query, token);
        token = tempResult.getToken();
        accumulatedCount += tempResult.getCount();
    } while (accumulatedCount < skipLimit);
    return token;
}

private int extractLimitValue(String query) {...}
private String replaceClause(String query, String clause, String value){...}

Это общая идея без обработки ошибок, она работает для любой произвольной страницы, за исключением страницы 1.

11
ответ дан 4 December 2019 в 00:25
поделиться

Я вспоминаю, что на одном из веб-семинаров с коричневыми пакетами вскользь упоминалось, что токены можно повторно отправить, и вы получите обратно соответствующий набор результатов.

Я не пробовал, и это всего лишь идея, но как насчет создания списка токенов, пока вы просматриваете страницу вперед? Затем, чтобы вернуться назад, просто просмотрите список назад и повторно отправьте токен (и выберите оператор).

1
ответ дан 4 December 2019 в 00:25
поделиться

я застрял в получении жетона - это то же самое, что и в Запросе?

Библиотека PHP SimpleDB, которую я использую, похоже, не возвращает ее. http://sourceforge.net/projects/php-sdb/

Нашла эту документацию. http://docs.amazonwebservices.com/AmazonSimpleDB/2009-04-15/DeveloperGuide/index.html?SDB_API_Select.html

, что, похоже, указывает на наличие элемента nextToken, но в примере ответа показывается RequestId...

Понял - наша PHP-версия действительно абстрагировала следующийтокен от того места, где у нас был к нему доступ. Откопал библиотеку и нашел ее.

0
ответ дан 4 December 2019 в 00:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: