いま、主なフレームワークでは主キーは1つに決めることになっている。Laravelでもそうだし、symfonyでもそうだ。
しかし、マイナーではあるけれど、マイクロソフト系のソフト、C#MVCだとか、WebではないがAccessなどでは、主キーを二つ作ることができる。
たとえばある喫茶店でコーヒーを頼んだとする。コーヒーは3番であらわされる。この顧客は10番であらわされる。10番の顧客が3番のコーヒーを頼んだわけだ。
これが1つの店なら、コーヒーのキーは3番で済む。
しかし、一つのサーバで二つの喫茶店を運営することにしたら?
店舗1番 コーヒー3番
店舗2番 コーヒー14番
かもしれない。店舗1と2の商品番号は入り乱れていることになる。主キーでいうと、1番から3番は店舗1、4番と5番は店舗2、6番は店舗1で7,8番は店舗2、みたいなことが起こりえる。
そして、たとえば評価の欄を作るとする。ショッピングカートのサイトに行くと評価のページがありますね。素晴らしいおいしいコーヒーでした!この時、7番のお客さんが3番の商品番号を参照し、評価5をつけた。7-3-5みたいなテーブルができることになる。
が、この人が店舗2番に入ったら、7-12-5の評価がついてしまう。
さて、データベースというものは10万件ぐらいまでは普通に動くのだが、10万を超えると設計次第では途端に動きが重くなったりするものだ。そこで、店舗1番を他のサーバに移したいと思ったとする。
商品番号は、主キーがもし一項目しかないなら、バラバラに店舗1、店舗2のものが混在している。そしてその商品の主キーにまつわる評価もバラバラに3とか14とかが入り乱れていることになってしまう。
それよりは、コーヒーは3番と決めてしまったらいいんじゃないか。
つまり、商品テーブルを作るにあたり
店舗1-商品3(コーヒー)
店舗2-商品3(コーヒー)
のテーブルを作って、商品IDと店舗IDを両方主キーにしてしまうのです。そうすれば、もし万一店舗1だけのデータを抜こうと思っても、商品番号はきれいに1から順番についたものを抜けばいいのだし、それに関連するデータも店舗IDだけ指定すればみなコーヒーは3番になっているはず。新しいサーバで店舗IDが1番から5番になったとしても、全テーブルの店舗IDだけ書き換えればいい。
で、自分が仕組みを作っていると、どうしてもそこで行き詰ってしまう。今のフレームワークでは主キーは1つで、2つ作るのはいろいろあるにしても、どうしてもややこしい。それは2つでないといけないからわざわざそういう仕組みを作っているだけで、「コーヒーは3番」ということを考えて作っているわけではないように見えるからだ。
う~ん・・・でも、もう自分も現役バリバリ世代ということでもなくなったし、しばらくは複数キーのやり方で行くか。