Friction River Software

  • お問い合わせ

CakePHP5入門【コラム⑩】クロステーブル

A子

電子メールってさー

ToやCcに複数のメールアドレスを指定することで、同じ文面のメールを複数人へ一斉送信できるじゃん

B美

そうね

まぁ、その複数人がお互いに面識のない人物だったら、ちょっと問題が生じるけどね

C菜

メールアドレスも「個人情報保護法」の対象ですもんね~
そのメールを受け取った人は、知らない人のメールアドレスを労せずして入手できちゃうってことになりますし~

まぁ、Bcc(ブラインドカーボンコピー)だったら他人のメールアドレスは見えなくなりますけど~

A子

Bccでは(受信者側の)メールソフトが迷惑メールに振り分けちゃう(かもしれない)からダメ!

だから100人に同じメールを送りたければ、一人一人個別の送信処理(Toに一件だけ指定する)を100回繰り返す必要があるわけ
(もしも手作業だったら、めっちゃ面倒くさくてやってらんねぇ(笑))

でもさー
Webアプリケーション(CakePHP)では、メール送信って簡単にできるじゃない

C菜

あ、わかりました~

データベーステーブルに複数人のメールアドレスを登録しておいて、そこから取得したレコードの数だけループを回せば良いんですね~
(100人分だったら100回のループを回して、ループの中で一件ずつ送信処理を行うって感じで…)

A子

そういうこと

名付けるなら「SPAMスパムメーラー」って感じかな

B美

SPAMスパムオプトアウトだから、絶対にやっちゃダメよ

メールを送る相手からは必ず承諾を得ていないとね(つまりは、オプトイン

A子

おぷと…何だって?

B美

同意なしが「オプトアウト
同意ありが「オプトイン」ってこと

相手の同意なしに広告メールや詐欺メールを送りつけてくる業者が世の中にはたくさん存在するわけだけど、そういう奴らのことをSPAMスパム業者なんて呼ぶわね
(なお、オプトアウトメールのことを一般的に「迷惑メール」とか「SPAMスパムメール」って呼んだりします)

C菜

そもそもSPAMスパムって単語は、何かの略称なんですか~?

B美

ハムみたいな肉(ランチョンミート)の缶詰のことをSPAMスパム缶と呼ぶわね
(要するに、SPAMスパムというのは商品名よ)

アメリカ製だから沖縄ではよく見かけるし、最近では(沖縄以外でも)ホームセンターなんかに置いてたりするわ

A子

いやいや、その缶詰がなんで迷惑メールと関係あるのよ?

B美

SPAMスパムメールの語源は、イギリスBBCのテレビ番組「モンティ・パイソン」よ

あるレストランを訪れた客が料理を注文しようとしたら、周りの客が一斉に「スパム!スパム!」って感じでSPAMスパムコールするの
SPAMスパム入りの料理を注文しろ!…って意味)

要するにコメディ番組ね…ちなみにその客はSPAMスパムが嫌いなの(笑)
あ、YouTubeにも動画があるから見てみると良いわ

C菜

商品名ということはその缶詰を製造している会社があるんでしょうけど、そこにとってはいい迷惑ですね~

B美

まぁね(苦笑)

でも「悪名は無名に勝る」って言うし…

A子

たしかに(笑)

んで、話は戻るけど、メールの一斉送信アプリって簡単に作れるよね?

B美

んー、データベース構造次第かな?
メールアドレスを格納するテーブルが一つだけなら簡単だと思うわよ

ただ、複数のグループを作ることができて、一つのグループに複数のメールアドレスを所属させることにする場合、ちょっと複雑になるかも…

C菜

あ、それに一つのメールアドレスを複数のグループに所属させることができるとしたら、さらに複雑になりますね~

A子

う…
頭がこんがらがってきた(汗)

例えばだよ
グループ」テーブルと「アドレス帳」テーブルがあって、こういう関係だとすると理解できるんだよ

グループ
idグループ名
1従業員

アドレス帳
idメールアドレスハンドルネームグループid
1ako@friction-river.jpA子null
2bimi@friction-river.jpB美1
3cina@friction-river.jpC菜1

これってB美とC菜の二人が「従業員」グループに所属しているってことね
(私は社長だから「従業員」グループじゃないわ)

C菜

それぞれの表の主キーは「id」で、「アドレス帳」テーブルの中にある「グループid」は外部キーですね~

A子

でもさー
私とB美が「同窓会」グループに所属する場合、B美は二つのグループに所属することになるんじゃない?
さっきC菜が言ってたのって、こういうことだよね?

グループ
idグループ名
1従業員
2同窓会

アドレス帳
idメールアドレスハンドルネームグループid
1ako@friction-river.jpA子2
2bimi@friction-river.jpB美1, 2
3cina@friction-river.jpC菜1

これって果たして可能なの?

B美

一つの枠内に入れられるのは一つの値のみ
(だから「グループid」項目の中に複数の値を格納することはできないわ)

要するに、関係データベースでは「1対多(または多対1)」の関係をテーブル間に作ることはできるけど、「多対多」の関係は絶対に作れないの

C菜

「1対多」とか「多対多」ってどういう意味ですか~?

B美

一つのグループには複数のアドレスを所属させることができる
これはグループ側から見れば「1対多」ってこと
(「多」とは複数の意味ね…つまり、アドレスが複数ってこと)

一つのアドレスは複数のグループに所属させることができる
これってアドレス側から見れば、やっぱり「1対多」になるの
(グループが複数ってこと)

こういうとき「グループ」と「アドレス」は「多対多」であると言えるわけ
(なお、「1対多」や「多対多」という表現を「カーディナリティ」と総称します)

C菜

「1対多」というのは、「主キー項目の値は絶対に重複しないけど、外部キー項目には同じ値が出現する(格納される)」ってことでしょうか~?

A子

あっ、そうか!
そういうことかー

でも、それじゃ「多対多」は不可能だって結論で良いの?

B美

いいえ

「多対多」を「1対多」と「多対1」に分解すれば良いのよ

A子

うっ、またわけの分からんことを…(苦笑)

B美

具体例で考えれば楽勝よ

グループ
idグループ名
1従業員
2同窓会

交差
idグループidアドレスid
112
213
321
422

アドレス帳
idメールアドレスハンドルネーム
1ako@friction-river.jpA子
2bimi@friction-river.jpB美
3cina@friction-river.jpC菜

ほら、「従業員」グループ(グループid:1)には私(アドレスid:2)とC菜(アドレスid:3)が、「同窓会」グループ(グループid:2)にはA子(アドレスid:1)と私(アドレスid:2)が所属しているってことが「交差」テーブルで示されてるでしょ?

C菜

「交差」テーブルの中にある「グループid」が外部キーで、「アドレスid」も外部キーなんですね~
(要するに、「交差」テーブルには外部キーが二つあります~)

A子

なるほど

外部キー側は「多」になるんだから、「グループ」テーブルと「交差」テーブルは「1対多
「交差」テーブルと「アドレス帳」テーブルは「多対1」ってことか…

B美

そういうこと

「グループ」テーブルと「アドレス帳」テーブルだけだと「多対多」になっちゃうけど、その間に「交差」テーブルを入れることで関係データベースでも実現可能になるのよ
(ちなみに「交差」テーブルのことを「クロス」テーブルと呼んだりもします)

A子

ふむふむ
世の中には「多対多」になる事象も割と多いと思うんだけど、それらを関係データベースで表現できちゃう…ってことかぁ

C菜

この考え方って、すっごく重要なものだと思いますよ~