何かを学ぶための最良の方法は、実際のシナリオでそれを実践することであるということは一般的な知識です。明らかに、同じことがデータベースモデリングにも当てはまります。そこで、この記事では、ホテルの部屋予約システムの教科書の例を取り上げて、簡単なデータベース構造を作成する方法を説明することにしました。開始方法と、モデルを拡張するためのアイデアをいくつか紹介します。
データベースモデリング:Discover、Discover、Discover
この記事では、ホテルの部屋予約システムのデータモデルを設計します。私たちは、架空のVERTABELO *****ホテルで予約された部屋、ゲスト、予約に関する情報を表すことができるデータモデルを探しています。この情報はすべてテーブルに保存されます。
データベースモデリングは循環的な発見プロセスです。まず、メインテーブルとその属性を特定します。このモデルでは、メインテーブルは次のとおりです。room
、guest
およびreservation
。次に、属性または列を検出して、テーブルを改良し続けます。たとえば、room
テーブルには次のような属性があります:room number
、name
およびsmoke
とりわけフラグ。
reservation
テーブルには属性date_in
があります 、date_out
、status
(キャンセル、確認済み)およびmade_by
(online、in_person、phone、mail)、テーブルの属性はguest
は:first_name
、last_name
およびmember_since
。おそらくあなたはreservation
テーブルにはより多くの属性(部屋のタイプ、ベッドの数など)が必要です。この点については後で説明します。それまでは、reservation
テーブルが不完全です。 Vertabeloで作成された次のデータモデルは、メインテーブルを示しています。
データ型:列に許可される値のドメインは何ですか?
すべての列には、列に割り当てることができる値の種類を示すデータ型(varchar、integer、date、boolean)があることに注意してください。たとえば、列smoke
テーブルのroom
ブール値です データ型。これは、trueまたはfalseのみが許可される値であることを意味します。
主キー:すべてのレコードの社会保障番号
すべてのテーブルには、テーブル内のすべてのレコードの識別子として機能する列(または複数)が必要です。この列は主キー(PK)と呼ばれ、データベース設計のベストプラクティスでは、すべてのテーブルにPKが必要であることが示されています。
以前のVertabeloデータモデルを見ると、すべてのテーブルにid
という列があることがわかります。 右側にPKインジケーターがあります。これらのid列はPKを形成します(慣例として、id
と名付けます PK列)。
重要な概念は、おそらく多くの読者にとって明らかなことですが、PK列に重複する値を含めることはできないということです。つまり、すべてのPK列には固有の制約があり、重複した値で新しいレコードを作成しようとすると、データベース・マネージャーによってエラーが発生して拒否されます。
発見を続ける;新しいデータベースオブジェクトを見つける
予約は、このデータモデルで表すより複雑な要素の1つです。 1つの予約には、多くの部屋を関連付けることができます(たとえば、「子供用に1つのダブルルームと3つのベッドを備えた別の部屋を予約したい」)。このビジネス要件により、モデルに4つの要素が追加されます。
新しいテーブル: room_reserved
、1つの予約に属するすべての部屋を保存します。
2つの参照を追加します: 参照は、データモデルの非常に重要な要素です。リファレンスは、あるテーブルが別のテーブルにどのように関連しているかを説明します。私たちのモデルでは、予約されたすべての部屋が1つの予約に属しているため、参照を使用してその事実をモデル化します。この参照は、両方のテーブルを結ぶ線としてグラフィカルに表されます。
さらに、すべての予約は1人のゲストに属するため、guest
およびreservation
テーブル。
列を移動する: 1つの予約に複数の部屋を含めることができるため、個々の部屋ごとにキャンセルを許可する必要があります。その後、attribute
を移動します。 reservation
reserved_room
テーブル。
更新されたデータモデルは、Vertabeloで設計された次の図に示されています。
参照によってリンクされたテーブルはどうなりますか?
2つのテーブル間に参照を作成すると、1つの新しい列がテーブルの1つに追加されます。この追加されたばかりの列は外部キーと呼ばれ、テーブル間の接続を可能にする他のテーブルへのポインタとして機能します。たとえば、次の図を見てください。
図。 1 テーブルreservation
およびguest
参照を追加する前後
発見を続ける;もっと見る
モデル化が保留されている1つのポイントは、一部のゲストが部屋を一定期間使用できるという事実です。このビジネスファクトを表すために、2つのテーブルを追加しました:hosted_at
およびoccupied_room
。
ホテルに滞在したすべての人がhosted_at
。このレコードには、彼/彼女が占有していた部屋とゲストへの参照が含まれます。これがhosted_at
guest
およびoccupied_room
。
テーブルoccupied_room
レンタルする部屋ごとに1つのレコードがあります。このレコードには、次のフィールドがあります:check_in
およびcheck_out
家賃の開始と終了を示すタイムスタンプタイプの。タイムスタンプデータ型は、任意の精度で特定の時点を格納します。すべてのoccupied_room
レコードには、賃貸されている部屋番号への参照も含まれ、hosted_at
この部屋に宿泊したゲストへ。
テーブルroom_type
データモデルへ。アイデアは、部屋のカテゴリまたは部屋のタイプごとに部屋をグループ化することです。たとえば、「標準のダブルベッド1台」、「豪華なダブルベッド2台」をタイプの説明にすることができます。ここにはmax_capacity属性もあります。
演習: データベース設計は、専門分野にアプローチするのは簡単ですが、対象分野の専門家になるには時間がかかります。データベース設計の最初のステップを実行している場合は、現在のデータモデルを完成させて、次のことを許可してください。
- 2人以上のゲストが部屋を共有している場合は、ゲストごとに異なるチェックインとチェックアウトを許可します。
- 場合によっては、ホテルが部屋の構成を変更することがあります(たとえば、標準のダブルベッド1台から豪華なダブルベッド2台に)。すべての部屋の履歴を維持しながら、これらの構成変更を表す要素をデータモデルに追加します。