• ベストアンサー

DBの正規化がわかりません・・・

こんにちは。 昔お世話になったペンションの顧客管理をファイルメーカーで作ろうかと思っています。ファイルメーカーも初心者ですが、DBも初心者です。そこでどうにか正規化をして 顧客マスター【顧客ID・氏名・ふりがな・郵便番号・住所・生年月日・電話番号・携帯番号・Fax番号・E-mail・宿泊回数】 部屋マスター【部屋ID・部屋名・分類(新館、ユニットバス付き等)】 飲み物マスター【飲み物ID・飲み物・料金】 温泉マスター【温泉ID・分類・料金】 宿泊テーブル【宿泊ID・日にち・夕食メニュー・朝食メニュー・日帰り温泉人数・宿泊人数】 明細テーブル(お客さんが何日にどの部屋に泊まり何を飲んだかを表示)【明細ID・顧客ID・部屋ID・宿泊ID・飲み物ID・消費税・総合計】 と正規化をしました。 わからないのは部屋の料金代をどこのマスターに入れたらいいかと言う事です。そこのペンションでは 大人の宿泊でも【新館・ユニットバス・朝食あり・なし・素泊まりなど】で料金が違いますので、部屋マスターに料金を入れるのは無理だと思います。どうしたらいいかご教授願えませんでしょうか?よろしくお願いします。 また参考になるサイトやソフト等があれば教えて頂けないでしょか?長々としてわかりにくいかもしれませんがよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • cse_ri2
  • ベストアンサー率25% (830/3286)
回答No.6

No.4の回答の続きです。 目的が顧客管理とのことですので、部屋代の項目は明細 テーブルに追加すればよいと思います。 同様に、飲み物代・温泉代の項目も明細テーブルに追加します。 顧客管理+売上管理をするのであれば、これで十分です。

amountainblast
質問者

補足

すみません。難しく考えすぎなのか・・・またよく分からなくなってきたのですが・・・ 飲み物マスターと温泉マスターを削除し明細テーブルに飲み物代・温泉代を追加し、金額はすべて手で入力をすると言うことでよろしいのでしょうか? 何度も申し訳ございませんが、よろしくお願いします。

その他の回答 (5)

  • togino
  • ベストアンサー率75% (97/129)
回答No.5

料金設定がなにやらややこしいように見えますが、 よ~するに 「料金は『部屋のランク』と『人のランク』の2つで 決まる」のですよね。 ■ 部屋ランク ID 内容 ------------ 1 共同浴室・トイレ部屋(洋室と和室) 2 浴室・トイレ付部屋(洋室のみ) ■ 人ランク ID 内容 --------- 1 大人食2食付 2 小学生のお子様 3 子供食2食付きベッド御用意 4 子供食2食付ベッド用意無し 5 子供食無し・ベッド御用意 6 子供食無し・ベッド用意無し 7 幼児(1歳未満) ■ 料金マスタ 部屋ランクID 人ランクID 料金 ------------------------------ 1      1     8,550 1      2     9,180 .... のようにマスターを用意します。 では、夫婦と小さいお子さんの合計3名が 宿泊されたとします。 宿泊テーブルには、「いつ」「どの部屋」に泊まったのか 書き込みます。 100,2004/7/25,333部屋名A (100 は宿泊テーブルのIDとする) 宿泊名簿テーブルには、「どの宿泊」「人ランク」を書き込みます。 100,1(大人食2食付) 100,1(大人食2食付) 100,3(子供食2食付きベッド御用意) 宿泊テーブルと宿泊名簿テーブルを結合すると 333部屋名A,大人食2食付 333部屋名A,大人食2食付 333部屋名A,子供食2食付きベッド御用意 が得られ、333部屋名Aのランクが2だとすると 料金テーブルから 333部屋名A,大人食2食付,9180 333部屋名A,大人食2食付,9180 333部屋名A,子供食2食付きベッド御用意,6405 となりますので、料金を SELECT SUM() すれば この宿泊の部屋代が 24765 円と計算されます。 --------- なんかごちゃごちゃしちゃいましたが、 整理すると 「『人』が集まって、1つの『宿泊』を形成する」 「『宿泊』には、1つの『部屋』が対応する」 ホテルのように『部屋』で料金が確定してしまう 場合もありますが、今回は『人』にも依存している ようなので、上記のような構成になっています。

amountainblast
質問者

お礼

何度もありがとうございます。 確かにごちゃごちゃしてややこしそうですね。 今回は#4さんが言うようにマスタ化しないで行きたいと思います。どうもありがとうございました。

  • cse_ri2
  • ベストアンサー率25% (830/3286)
回答No.4

この業界でもう10数年メシを食っています。 経験則から述べますが、料金についてはマスタ化しない方が、 間違いは少ないです。 宿泊料金といっても、何年かに1回は変化するでしょう。 もし料金をマスタ化した場合、世代管理をしっかりしないと 過去のデータに信頼性がもてなくなります。 この場合は、明細テーブルに金額を直接入力するようにして ください。 こういう方式にしておけば、たとえ一ヶ月単位で宿泊料金 に変化が生じても、毎日の入力さえ間違えなければ何の問題 も発生しません。 どうしても料金マスタが欲しい場合は、どのテーブルとも リンクさせずに、明細テーブルに入力した値に間違いがないか どうか、プログラムでチェックする程度に留めた方がよい でしょう。

amountainblast
質問者

お礼

ありがとうございます。 なるほど、なんでもかんでもマスタ化するばいいってもんじゃないんですね・・・。とても参考になりました。 明細テーブルのフィールド定義は元のまま変えなくてもいいんですか?

  • togino
  • ベストアンサー率75% (97/129)
回答No.3

すこしおせっかいなのかもしれないですが・・・ amountainblast さん、なんか複雑に考えて 頭んなかグルグルしてません? そのペンションでは、部屋代をお客さんに請求するん ですよね。その時、現在のオーナーさんは、どうやって その額を決めているんですか?まさか気分で決めてるんじゃ ないですよねぇ(^^;) その決め方が分かれば、その通りに設計すればいいだけです。 例ですが ・部屋にはランクがある。Aランクは何円。 ・朝食つきだとプラス何円する ・子供の食事は半額 ・1泊なら何円、2泊なら何円 などなど、何か決まりごとがない限り、料金は決定 できないですよね。 部屋代を決めるのに、必要な情報ってなんなのでしょう? これを教えていただかないと、こちらの推測で、 データベース設計してしまうので、ちぐはくして しまう気がしますよ。

amountainblast
質問者

補足

ありがとうございます。 確かに難しく考えているかもしれません・・・ 料金は 内    容 共同浴室・トイレ部屋洋室と和室 浴室・トイレ付 洋室のみ  大人食2食付 8,550円 9,180円 (ただし小学生のお子様は) (7,350)円 (7,980円) 子供食2食付きベッド御用意 6,090円 6,405円 子供食2食付ベッド用意無し 3,675円 3,990円 子供食無し・ベッド御用意 3,675円 3,990円 子供食無し・ベッド用意無し 1,575円 1,890円  幼児 1歳未満 無 料 無 料 となっています。 よろしくお願いします。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

食事マスターを増やして部屋マスターに部屋料金の項目を追加してはいかがですか。

amountainblast
質問者

補足

ありがとうございます。すみませんが、少し質問ですが、食事マスターを増やすということは、夕食だとプラス何円、朝食だとプラス何円という計算を部屋マスターの部屋料金からすると言うことでしょうか?しかしこの場合は子供だとどういった計算になるのでしょうか?

  • rucifer
  • ベストアンサー率46% (6/13)
回答No.1

料金テーブルを作成すればよいのではないかと思います。 部屋マスター  部屋ID 料金  部屋ID(外部キー  料金タイプ(   料金  PRIMARY KEY (部屋ID, 料金タイプ)

amountainblast
質問者

補足

ありがとうございます。 なるほど料金テーブルを作成すればいいんですね。すみませんが、少し疑問なのですが、部屋IDが外部キーということは部屋マスターの部屋IDとリレーショナルで繋ぐと言うことですよね。部屋IDをPRIMARY KEYにした場合 レコードになるんでしょうか? 例えば部屋マスターの部屋ID.333部屋名Aというレコードが合った場合これに対する料金は 大人2食付きの場合と大人夕食抜き朝食あり・大人夕食あり朝食抜きの3通りがあるとしますよね。ここで部屋IDにPRIMARY KEYを設定してしまうと部屋ID333は1レコードしか作れなくなると思うのですが、そうでもないのでしょうか? 素人考えですみませんが、よろしくお願いします。