今週からはクラウド基盤「Google App Engine(以下、GAE)」の検索機能についてご紹介したいと思います。
今回は基本中の基本、主キー検索です。
主キーなんてあったっけ?
さて、いきなりですが、ここでGAEの個性が出て来ます。
「いつ主キーなんて定義したんだ?」
これですね。
普通のDBでの開発の場合、先にDB設計で主キーを定義して、Javaではそれを主キーであると認識の元で使うというやり方です。
つまり、「Javaから見たら主キーかどうかなんて分かりゃしないが、プログラマーが主キーとして使うように頑張る」、これが基本です。
(まあ、HibernateとかiBatisとかDBマッピングライブラリを使いますと、Javaの実装上で主キーであることが明示的になるよう制約を入れてくれたりするわけで、普通はそういうライブラリを使う物ですけどね。)
ともかく、私が言いたいのは、「DB設計なんか無いGAEで主キーの定義はいつやるんだ?」ということです。
それは、これ。
Javaのモデル中にベタ書きするんです。
/** キー */ @Attribute(primaryKey = true) private Key key;
「@Attribute(primaryKey = true)」というアノテーションがありますね。
これが主キーであることを指し示します。
そしてその下、「Key」クラス。これが主キー型です。
StringやIntegerを主キーとして使うのでは無く、Keyという主キー型が存在する。
これがGAEの特徴です。
どうやってパラメータをセットするの?
次の疑問です。
「主キーには商品IDをセットしたいんだけど、Key型って何よ?」
そうです。
主キーが「商品ID」なら、普通なら主キーは「String shohinId」でしょう?
でも、GAEの場合は「Key key」ですので、そう単純ではありません。
GAEの場合、主キーは2種類のやり方があるようです。
- 自動インクリメント
- 明示的にセット
この2つです。
そして「自動インクリメント」の方がGAEの標準です。
今回は初級編ですし、後者「明示的にセット」の方は後回しとし、自動インクリメントの方から調査していきます。
自動インクリメント
システム開発をやっている過程で、「主キーは数字。1から順にカウントアップする」という設計を見たことはありませんか?そう、自動インクリメント主キーですね。
その場合、主キーとなるその数字は「ID」というカラム名が振られていることが多いです。
- ID:自動シーケンス番号。1から順にカウントアップする。
- shohinId:主キーではなく一意キー。
こういう作りになっているケースです。
はい?
「shohinIdで一意なんだから主キーとして使えよ」って?
ごもっともです。
DB設計としてはそれが一番合理的。
何でわざわざ商品ID以外に別の主キーを用意せねばならんのやら……。
これには実装側の都合があるのですよ。
DB専門のDBスペシャリストがDB設計すると、必ず「主キーはshohinId」になりますよ、絶対。
でも、実装まで考慮するJavaプログラマーがDB設計をやった場合、必ずしもそうはなるとは限りません。
何故なら、主キーってのは「複数個のカラムで一個の主キー」というケースもありますから。
その場合、Javaのソースはこうなります。
Entity entity = dao.get(主キー1,主キー2,主キー3,主キー4,主キー5);
主キー多過ぎでソースがグダグダ。
でも、自動インクリメントのIDを主キーにしたら?
Entity entity = dao.get(id);
スッキリしましたね!!
そう、IDで一発なんですよ。
「テーブルの主キーは全部ID」「主キー検索=ID検索」という制約の元でDB設計することにより、実装効率が高まるのです。
なので、私はこのID使用のDB設計を好みます。
今回の連載とは関係ありませんが、あの有名な「Ruby On Rails」もこのID使用のDB設計を前提とするものです。
プログラマーとしては一考の価値のある思想です。
ともかく、GAEにもID思想は存在しまして、それがGAEの基本です。
自動インクリメントですかあ、特に明示的にセットする必要はありません。
過去にご紹介した「DB登録編」でも、特に主キーについてはアピールが無かったのもその為。
DBに保存した時に、勝手に主キーは入っている
登録時は主キーを気にする必要は無いのです。
ログを見てみましょう。
toStringすることにより「key=Shohin(57)」と、バッチリ主キーのシーケンス番号が入っていることが分かりますね。
この数字のパラメータ名はID、型はlong型です。
以下のやり方で取得出来ます。
long id = shohin.getKey().getId();
検索の時は、このIDで検索してあげれば良いんです。
分かれば簡単ですね。
終わりに
今回で「主キーとは何ぞや」ということが分かりました。次回は実際にこれを使って検索します