mySQLのトランザクションテーブルから複数のマスターを参照するためのJOINのやり方

洋服は古着屋で買っている。同じテイストの服を揃えたり上下をセットアップで買うことができないと、テイストがバラバラになり収拾がつかなくなる。同じようなものを二つ買ったりパンツはあるのにジャケットがないというようなことが頻繁にある気がする。気がするのだがよくわからない。そこでワードローブを整理・把握しようと考えた。

毎日着る洋服を写真撮影して使ったアイテムをデータベースに記録している。これを使ってワードローブを整理しようと思いついたのだ。




まず傾向を整理するために「これは成立しているな」という写真を集めてきた。これをテイストごとに分類する「ブック/BOOK」を作った。そもそもでたらめに着ているのだから取り止めがない。だからこのブックを作るまでが難作業だった。当初グループは200になった。

これを傾向ごとに集めてきてソートし直した。例えばミリタリー調のものは一つに集め、ジャケットとウールパンツはまた別のグループに分ける。こうして、グループをまとめた大グループが14できた。思いつきでやっているので大グループの大きさは様々だ。

ある程度ブックを整理し終わったのでブックに使っているアイテムの写真を表示したいと思った。これがなかなか難作業だった。ここからが本題である。学校で習った人からみると「なぜこんなことをするのだろう」と思えるかもしれないが、素人がSQLを扱うとこういうことになってしまうという一例だ。

最初に思いついたやり方は次のようなものだ。

  • BOOK NAMEテーブルをみてそこからコーディネートの写真が記録されているPHOTOテーブルを参照する。
  • PHOTOに使われているアイテム – ITEMを全て抜き出す
  • ITEMのコードからアイテムの名前 ITEMの名前を割り出す

テーブルではなく仮想テーブルであるVIEWを使うのだが最初はVIEWの作成を1つづつやっていた。VIEWを最初に作る時にはCREATE文を使い、置き換える場合にはALTERを使う。

CREATE VIEW
viewの名前
(項目1,項目2,項目3)
AS SELECT *
FROM …

これを3回やっていた。「これが馬鹿馬鹿しい」ということがわかったのは後々のことだった。つまりSQLはJOIN句を複数書けるということを知らなかったのである。

FROM BOOK_NAME AS BN
RIGHT JOIN PHOTO AS P ON BN.key=P.book
LEFT JOIN ITEM_USED AS I ON P.photo=I.photo
LEFT JOIN ITEMS AS IT ON I.item=IT.id

おそらく学校で習った人は「なんでこんな面倒なことをしているのだろう」と思うのではないか。間違いの理由はトランザクションとマスターテーブルを混同していることだ。今回はBOOKの名前のテーブルから新しいVIEWを作っている。

マスターとトランザクションとはなんだろうか。マスターは例えば品物の名前や店の名前を記録したテーブルだ。一方トランザクションは日々の売り上げをログととして記録したテーブルのことである。

例えば、レジに売り上げが記録されているとする。これをSALES(売り上げ)テーブルと呼ぶ。SALESテーブルには店のコードと品物のコードが書かれている。店の名前はSTOREテーブルにあり品物の名前や種類はITEMテーブルにある。これらがマスターと呼ばれる。マスターのテーブルを書き換えれば店名や品物の名前は自動で書き換わる。

この例ではSALESテーブル(トランザクション)から店の名前と品物の名前(マスター)を参照するのが良い。こうするとJOINが二回で済む上に全てがLEFTJOINで済む。

FROM SALES AS S
LEFT JOIN ITEM AS I ON I.code=S.store_code
LEFT JOIN STORE AS ST ON ST.code=S.item_code

常にトランザクションから出発する癖をつけておけばコードがシンプルに済む上に「あれ、LEFTだっけRIGHTだっけ?」と悩む必要はなくなる。常にLEFTを使えばいい。

と同時になんらかの理由でマスターテーブルから出発する場合にはRIGTHを使えばいいのだとわかった。これまで何度聞いてもよくわからなかったRIGHTとLEFTの使い分けだがトランザクションからマスターの項目を参照する場合にLEFTを使い、逆の場合にはRIGHTを使えばいいのである。

今回の例の場合、1日のコーディネートに使われている品物の数は複数あるため、トランザクションから一回の問い合わせで品物の名前にたどり着くことはできない。いったんすべての品物のコードを抜き出してから名前を問い合わせするという手続きが必要である。だが考え方は一緒だ。

総括するとそもそも洋服を買う時に「この洋服はこの組み合わせで着よう」と決めてから買ったほうがよかった。次にこれを記録する時にトランザクションとマスターを分けて設計したほうがよかった。さらに常にトランザクションからマスターを参照するのだという癖をつけていればよかった。

つまり正解を決めていれば迷う必要はなかった。だが、裏返せば試行錯誤ができないのだから新しい組み合わせにたどり着くこともなかったことになる。洋服のコーディネート知識の基礎はおそらく20歳代で身につく。例えばカジュアルのシャツは必ず外に出したほうがカッコイイとかスーツは大きめのサイズを選ぶというのは平成の初期の流行である。だが最近は必ずしもそうではない。試行錯誤しないとこういうことには気がつけない。

さらにRIGHT JOINをどんな場合に使うのかなどにも気がつけなかったかもしれない。きちんと総括さえすれば試行錯誤も悪くはない。だが総括なしに試行錯誤してもそれは単に混乱を有無だけである。

Google Recommendation Advertisement



コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です