RDBMSとNoSQLデータベースを比較するとき、「テーブル結合」や「データ検索」についてはよく議論になりますが、データベースを利用したアプリケーションを作るときに忘れてはいけないポイントの1つに「ソート(並べ替え)処理」があります。
RDBMSでは、データの物理的な格納位置は隠ぺいされているので、ユーザーはSQLを書くだけで、データのありかを気にすることなく必要な情報にアクセスできます。一方、RDBMSはSELECT文で問い合わせたときに得られる結果セットがどのような順序で返ってくるのかということについては何の保証もありません。
結果セットの並び順を指定するには、データを問い合わせるSELECT文にORDER BY句を指定します。SQLのORDER BY句には列名を直接指定できます。そのほかにも、集計関数の計算結果やCASE式など、さまざまな方法で順序を指定できます。
RDBMSを使うことを前提にしたシステムを開発するなら、どのRDBMS製品を使ったとしてもSQLを利用してデータを並べ替えることは容易にできます。しかし、NoSQLデータベースはアクセス効率を優先するために、1通りの順序(キーの大小順、データ登録時のタイムスタンプ順など)でデータを返す仕様になっているものや、そもそも並べ替え機能を持たないものもあります。このような場合でも、アプリケーション側でデータの順序を並べ替えることは可能です。
並べ替えルールが「○○列の昇順(あるいは降順)」のように単純なら、結果セットを取得してから、アプリケーション側で並べ替えるだけでもよいでしょう。しかし、これまでSQLのORDER BY句で「計算式の結果順に表示させる」とか「結合先テーブルの値順に並べ替える」といったように複雑なルールでデータを並べ替えていたのなら、少し工夫が必要です。
このよう場合は、図3のようにキー情報とソートの順位情報をペアにしたものを「ソート順位列」として事前に用意しておくことで対応できます。ただし、この方法は事前計算値を保持するというやり方なので、SQLと違ってデータ取得のタイミングで動的にソート条件を変更することはできません。複数の条件を切り替えてソートしたい場合は、複数のソート順位列を用意しておくなどの対策が必要です。
もう少し複雑な例を考えましょう。取得対象のデータ量が多いときにデータを全件取得すると、時間がかかってしまうため結果セットの一部だけを取得、表示することがあります。このようなときは、部分的に取得したデータの集まりだけを並べ替えても、全体として正しい並び順になるとは限りません。
例えば、100件あるデータを「価格の安い順」でソートした結果の先頭10件だけを、今度は「発売日順」で並べ替えたとしても、正しい結果にはなりませんね。並び順を変更するには、もう一度、元のデータ100件を並べ替えてから結果を取得する必要があるのです。このような場合は、それぞれのソート順位を転置インデックスに持たせることで対応可能です。
今回は、RDMSならSQLを使って簡単に実現できる「データの検索(絞り込み)」と「並べ替え処理」をNoSQLデータベースで実現する方法を紹介しました。今回紹介した方法はイメージをつかんでもらうため、あえてシンプルな方法を紹介しました。もちろんこれが唯一の正解ではありません。他にも良い方法はたくさんあると思いますが、「データベース側にないものはアプリケーションで解決する」という基本的な考え方だけでも伝われば幸いです。
次回も「RDBMSなら簡単にできるデータ読み取りをNoSQLで実現する」の後半戦として、これまでSQLで動的に実現してきた「テーブル結合(JOIN)」やデータ集計(COUNT、SUM関数やGROUP BY句)をNoSQLデータベースで実現する方法を説明していきます。
株式会社システムインテグレータ
渡辺俊史
製品企画本部 製品開発グループ
Copyright © ITmedia, Inc. All Rights Reserved.