McDonald's Hamburger DB

情報工学科3年  学籍番号 60607038  冠木 亮

大手ファーストフードチェーン「マクドナルド」のハンバーガーを題材にしたデータベースです。
各ハンバーガー毎に、販売時間帯や使用されている具材、バンズ種類などをまとめました。
情報はハンバーガー単品のみですが、カロリーや値段も入っています。
なお、一部の属性値に架空のデータを用いています。




データベースへ



第3課題からの変更点

ハンバーガーの情報を格納するエンティティhumbergerに
その画像ファイルを格納する属性pictを追加。
また、bans,humberger,mainの各エンティティに
その解説文を格納する属性kaiを追加し、データベースとしての
体裁を整えました。


さらに、正規化するにあたり、単なるコード表となってしまう
おそれがあって削除したtimeエンティティを、今回のhtml化のために
あえて復活させ、humbergerエンティティ内の属性timeをchar型からint型に
変更しました。



第4課題で用いたスキーマ

ハンバーガーの情報を格納するエンティティhumberger(id int,name char(30),time int,bans int,main int,source int,price int,calory int,pict char(30),kai char(60))
バンズの情報を格納するエンティティbans(id int,name char(20),price int,maker int,kai char(60))
メイン具材の情報を格納するエンティティmain(id int,name char(10),price int,maker int,kai char(60))
ソースの情報を格納するエンティティsource(id int,name char(20),maker int,shelflife int)
各業者の情報を格納するエンティティmake(id int,name char(20),tel char(12))r
販売時間帯の情報を格納するエンティティtime(id int,name char(10))



データベース作成に使用したSuperSQLの命令文

販売時間帯から検索(time.sql)
generate html
{{"番号"@{width=40,align=center,bgcolor=coral},"販売時間帯"@{width=198,align=center,bgcolor=coral}}@{width=240,align center}!
[{(asc1)t.id@{width=40,height=48,align=center},sinvoke(t.name@{width=196,height=48,align=center},file="time2.sql",att1=t.id)}
@{width=240,height=48,align=center}]!}@{tablealign=center}
from time t
販売時間帯の一覧表を表示します。
販売時間帯を選択することで、その時間帯に販売されているメニューのみを表示します。

時間帯ごとの販売メニュー一覧(time2.sql)
foreach t.id
generate html
{{"番号"@{width=40,align=center,bgcolor=coral},{t.name"時間帯に販売しているバーガー"}@{width=298,align=center,bgcolor=coral}}
@{width=340,align center}!
[{(asc1)h.id@{width=40,align=center},sinvoke(h.name,file="berger.sql",att1=h.id)@{width=300,align=center}}
@{width=340,align=center}]!}@{tablealign=center}
from humberger h,time t
where h.time=t.id
指定した時間帯に販売されているバーガーのみを一覧で表示します。
バーガー名を選択することで、そのバーガーの詳細ページにジャンプします。

バーガー名から検索(name.sql)
generate html
{{"番号"@{width=40,align=center,bgcolor=coral},"名前"@{width=198,align=center,bgcolor=coral}}@{width=240,align center}!
[{(asc1)h.id@{width=40,align=center},sinvoke(h.name,file="berger.sql",att1=h.id)@{width=200,align=center}}
@{width=240,align=center}]!}@{tablealign=center}
from humberger h
バーガー名の一覧表を表示します。
バーガー名を選択することで、そのバーガーの詳細ページにジャンプします。

バンズの種類から検索(bans.sql)
generate html
{{"番号"@{width=40,align=center,bgcolor=coral},
"バンズの種類"@{width=198,align=center,bgcolor=coral},
"解説"@{width=400,align=center,bgcolor=coral},
"原価"@{width=80,align=center,bgcolor=coral},
"製造業者"@{width=200,align=center,bgcolor=coral}
}@{width=920,align center}!
[{
(asc1)b.id@{width=40,height=48,align=center},
sinvoke(b.name@{width=196,height=48,align=center},file="bans2.sql",att1=b.id),
b.kai@{width=400,height=48,align=center},
b.price@{width=80,height=48,align=Center},
sinvoke(m.name@{width=200,height=48,align=center},file="maker.sql",att1=m.id)
}@{width=920,height=48,align=center}]!
}@{tablealign=center}
from bans b,maker m
where b.maker=m.id
バンズの一覧表を表示します。
バンズ名を選択することで、そのバンズを使用しているバーガーの一覧ページへジャンプします。
また、製造業者名を選択することで、その製造業者の連絡先を表示します。

バンズごとに使用されているバーガー一覧(bans2.sql)
foreach b.id
generate html
{{"番号"@{width=40,align=center,bgcolor=coral},{b.name"を使用しているバーガー"}@{width=278,align=center,bgcolor=coral}}
@{width=320,align center}!
[{(asc1)h.id@{width=40,align=center},sinvoke(h.name,file="berger.sql",att1=h.id)@{width=280,align=center}}
@{width=320,align=center}]!}@{tablealign=center}
from humberger h,bans b
where h.bans=b.id
指定したバンズを使ったバーガーのみを一覧で表示します。
バーガー名を選択することでそのバーガーの詳細ページにジャンプします。

メイン具材から検索(main.sql)
generate html
{{"番号"@{width=40,align=center,bgcolor=coral},
"メイン具材"@{width=198,align=center,bgcolor=coral},
"解説"@{width=300,align=center,bgcolor=coral},
"原価"@{width=80,align=center,bgcolor=coral},
"製造業者"@{width=200,align=center,bgcolor=coral}
}@{width=820,align center}!
[{(asc1)m.id@{width=40,height=48,align=center},
sinvoke(m.name@{width=196,height=48,align=center},file="main2.sql",att1=m.id),
m.kai@{width=300,height=48,align=center},
m.price@{width=80,height=48,align=center},
sinvoke(a.name@{width=200,height=48,align=center},file="maker.sql",att1=a.id)}
@{width=820,height=48,align=center}]!}@{tablealign=center}
from main m,maker a
where m.maker=a.id
メイン具材の一覧表を表示します。
具材名を選択することで、その具材を使用しているバーガーの一覧ページへジャンプします。

また、製造業者名を選択することで、その製造業者の連絡先を表示します。
メイン具材ごとに使用されているバーガー一覧(main2.sql)
foreach m.id
generate html
{{"番号"@{width=40,align=center,bgcolor=coral},{m.name"を使用しているバーガー"}@{width=298,align=center,bgcolor=coral}}
@{width=340,align center}!
[{(asc1)h.id@{width=40,align=center},sinvoke(h.name,file="berger.sql",att1=h.id)@{width=300,align=center}}
@{width=340,align=center}]!}@{tablealign=center}
from humberger h,main m
where h.main=m.id
指定したメイン具材を使ったバーガーのみを一覧で表示します。
バーガー名を選択することでそのバーガーの詳細ページにジャンプします。

製造業者の詳細ページ(maker.sql)
foreach m.id
generate html
{
{m.name"の連絡先"}@{width=200,align=center,bgcolor=coral}!
m.tel@{width=200,align=center}
}@{tablealign=center}
from maker m
各製造業者の連絡先を表示します。

各バーガーの詳細ページ(berger.sql)
foreach h.id
generate html
{imagefile(h.pict,path="./image/")@{width=190,heigth=190,align=center},
[{"販売時間"@{width=344,align=left,valign=center,bgcolor=coral}!
sinvoke(t.name@{width=344,align=left},file="time2.sql",att1=t.id)}!
{"番号"@{width=40,align=center,valign=center,bgcolor=gold},
"名前"@{width=240,align=center,valign=center,bgcolor=gold},
"価格"@{width=60,align=center,valign=center,bgcolor=gold}
}@{width=340}!
{h.id@{width=40,align=center},
h.name@{width=240,align=center},
h.price@{width=60,align=center}
}@{width=340}!
{"バンズ種類"@{width=140,align=center,valign=center,bgcolor=greenyellow},
"メイン具材"@{width=140,align=center,valign=center,bgcolor=greenyellow},
"カロリー"@{width=60,align=center,valign=center,bgcolor=greenyellow}
}@{width=340}!
{sinvoke(b.name@{width=140,align=center,valign=center},file="bans2.sql",att1=b.id),
sinvoke(m.name@{width=140,align=center,valign=center},file="main2.sql",att1=m.id),
h.calory@{width=60,align=center,valign=center}
}@{width=340}!
{"ソース"@{width=120,align=center,valign=center,bgcolor=powderblue},
"解説"@{width=222,align=center,valign=center,bgcolor=powderblue}
}@{width=340}!
{[sinvoke(s.name@{width=120,align=center,valign=center},file="source2.sql",att1=s.id)]!,
h.kai@{width=220,align=center,valign=center}
}@{width=340}]!
}@{tablealign=center}
from humberger h,bans b,main m,source s,time t
where h.bans=b.id and h.main=m.id and h.source=s.id and h.time=t.id
選択されたバーガーの詳細を表示します。
ここで販売時間帯をクリックするとそのバーガーと同じ販売時間帯のバーガーの一覧表を、
バンズ種類をクリックすると、そのバーガーと同じバンズで作られるバーガーの一覧表を、
メイン具材をクリックすると、そのバーガーと同じ具材を使用しているバーガーの一覧表を、
ソース名をクリックすると、ソースの詳細と、そのバーガーと同じソースが使用されているバーガーの一覧表を
それぞれ表示するページにジャンプできます。


ソースの詳細ページ(source2.sql)
foreach s.id
generate html
{
{"名前"@{width=100,align=center,bgcolor=coral},
"賞味期限"@{width=80,align=center,bgcolor=coral},
"製造業者"@{width=200,align=center,bgcolor=coral},
{s.name"を使用しているバーガー"}@{width=300,align=center,bgcolor=coral}
}@{width=680,align center}!
[{
s.name@{width=100,height=48,align=center},
{s.shelflife"日"}@{width=80,height=48,align=center},
sinvoke(m.name@{width=200,height=48,align=center},file="maker.sql",att1=m.id),
[sinvoke(h.name@{width=296,height=48,align=center},file="berger.sql",att1=h.id)]!
}@{width=380,height=48,align=center}]!
}@{tablealign=center}
from humberger h,source s,maker m
where s.maker=m.id And h.source=s.id
選択されたソースの賞味期限と製造業者、またそのソースが使われているバーガーの一覧を表示します。


感想

psql上でデータベースを操作しているときは、なかなか実感がわかなかったため、
退屈な作業になりがちでしたが、今回SuperSQLを用いて実際にhtmlに出力してみると、
データベースの便利さを身に染みて感じることができました。

SuperSQLではコマンド一発で自動でhtmlを作成してくれるだけでなく、
ある程度自由にレイアウトを構成することができるため、出力ファイルを見ながら
どんなレイアウトがみやすいか、などの試行錯誤がとてもおもしろく、
最初はエラーだらけでイライラしていたのが、最後には楽しくなってきていたことに驚いています。

ただ、SuperSQLについて希望を述べるとすれば、もう少しエラーメッセージをわかりやすく
して欲しかったです。途中何度もエラーに悩まされましたが、エラーメッセージの読み方が
わからなかったために、エラーの度にソースを上から下までチェックしなくてはならず、大変苦痛でした。


作成したデータベースも、使用したSuperSQLコマンドも基礎的なものであったとは
思いますが、自分で決めたテーマにしたがってやってきた半年間が成果としてあらわれているようで
とてもよかったです。
講義も演習も毎週ついていくのが大変でしたが、とても楽しく、自主的に勉強したのは
おそらくこの科目が一番だったと思います。