« 古くて新しい? 遅延ブロッククリーンアウト (deferred block cleanout) #12 | トップページ | 誰がどんな名前のペットを飼っているのかな? 解答編 / JPOUG Advent Calendar Day 23 »

2021年12月 1日 (水)

誰がどんな名前のペットを飼っているのかな? その1 / JPOUG Advent Calendar Day 1

今年も師走の風物詩、JPOUGアドベントカレンダーがはじまりましたー。2021も残すところ1ヶ月。来年も元気にOnline, In personでお会いしたいですね!

前置きはごれぐらいにして、

今回の私のエントリー、Oracleというかデータベース使う必要はないのですが、RDBMSというかSQLで解けるじゃん、この問題! 
ということで、中二の期末試験で「時間があったらチャレンジしてね!」という問題をネタにしてみました。

なお、本エントリーと、12/23日のエントリーの二部構成にして、本エントリーではネタ振りのみです!w

SQLがからんでいればどうやって解いても良いと思っています。冬の夜長に、ワイン片手に、頭の体操するのもよいのではないでしょうか? 
皆さんも考えてみてくださいね。

この問題、中学二年の数学のおまけの問題なので、紙と鉛筆、頭の良い方は、頭の中だけでも解けるわけですがw  
あえて、SQLで頑張ってみましょうw

問題は以下の通り。



Hiro, Larry, Scott, Steveは、Cat, Dog, Snake, Turtleのうち、どれか 1 種類のペットを飼っています。同じ種類のペットおよび、同じ名前のペットを飼っている人はいません。 4 人のペットの名前は、Lisa, Taro, TIger, Wendyのいずれかです。

  • Hiro :「僕が飼っているのは、Tiger だよ。 Turtle じゃないよ」
  • Larry : 「Snake の名前は、Lisa じゃないよ」
  • Scott : 「僕は Snake を飼っているよ」
  • Steve : 「Dog の名前は Wendy だよ。僕は Dog はかってないけど」

誰がどんな名前のペットを飼っているのかな?



 

答え合せは12/23の窓で行う予定です。

みなさん、お好きな方法で解いてみてください。。 :)

ちなみに、私は、愚直な方法でw 答えを導きだすつもりです。 みなさんは、よりスマートな方法を考えてみるのもおもしろいかもしれませんね!

答えではないですが、私がパッと考えている脳内イメージをアウトプットしておきます。(私のイメージにこだわる必要はないので、みなさんは自由な発想で取り組んでいただければと思います)

問題から、ざっくりとエンティティをイメージしてみると3つ。

  • ペットのオーナー
  • ペットの名前
  • 動物の種類

ただ、これだと、多:多の関係になってしまうので、関連エンティティぐらいは作ったほうが無難ですよね。そのままデカルト演算して答えを導きだすツワモノもいるかもしれませんがw 

で、関連エンティティをこれまた、ざっくりイメージしてみると、こちらも3つありそうですよね。問題文をよーく読み込んでみてください。3つ見えますよー。

  • 「ペットのオーナー」と「ペットの名前」を関連づけるエンティティ
  • 「ペットの名前」と「動物の種類」を関連づけるエンティティ
  • 「ペットのオーナー」と「動物の種類」を関連づけるエンティティ

こんな感じ、で6つのエンティティが浮かんだのですが、みなさんはどうみえますか?

 

少々悩んだののですが、この問題を解くために、後半の3つのエンティティを表で実装するか、ビューで実装するかってところもあるかなぁと。表にしなくてもビューでもいいかーと。

ということで、私は、以下を3表を元に、

  • ペットのオーナー
  • ペットの名前
  • 動物の種類

関連は、以下の3つのビューで実装してみようかなーと。(妄想中)

  • 「ペットのオーナー」と「ペットの名前」を関連づけるビュー
  • 「ペットの名前」と「動物の種類」を関連づけるビュー
  • 「ペットのオーナー」と「動物の種類」を関連づけるビュー

3つの表と3つのビューを駆使してw SQLだけで、愚直に、解く予定ですw

なお、元になる3エンティティに対応した表のDDLとデータは以下のような感じで。


create table owners (name varchar2(30) not null unique);
create table pets (name varchar2(30) not null unique);
create table animals (kind varchar2(30) not null unique);
-- owners
insert into owners(name) values('Hiro');
insert into owners(name) values('Larry');
insert into owners(name) values('Scott');
insert into owners(name) values('Steve');
-- pets
insert into pets(name) values('Lisa');
insert into pets(name) values('Taro');
insert into pets(name) values('Tiger');
insert into pets(name) values('Wendy');
-- animals
insert into animals(kind) values('Cat');
insert into animals(kind) values('Dog');
insert into animals(kind) values('Snake');
insert into animals(kind) values('Turtle');
commit;

SCOTT@ORCL> select name from owners;

NAME
-------------------------------
Hiro
Larry
Scott
Steve

Elapsed: 00:00:00.01
SCOTT@ORCL> select name from pets;

NAME
------------------------------
Lisa
Taro
Tiger
Wendy

Elapsed: 00:00:00.01
SCOTT@ORCL> select kind from animals;

KIND
------------------------------
Cat
Dog
Snake
Turtle

Elapsed: 00:00:00.01

 

では、12/23の答え合せまで、みなさんも、ワイングラス片手に、(お酒が苦手な方はウィルキンソンでもw)自由にあそんでみてください :)

明日は、12/2、二つ目の窓は、渡部さんです。お楽しみにーっ。

 

|

コメント

コメントを書く