web-dev-qa-db-ja.com

イベント予約システム:データベース設計

イベント(コンサート、劇場、映画館など)の予約サイトを作りたい

venuesテーブル:

-ID
-name
-address

stagesテーブル:

-ID
-venue_id
-title
-seats

-seatsはjsonで、座席の行と列が含まれています

  1. 最初の質問はどちらが良いですか?各ステージの座席の別のテーブルを作成するか、座席プロパティのフィールドの列を作成しますか?

次に、各シートの価格とevent_idを設定するshowtimesテーブルが必要です。

  1. 座席ごとに行を作成するのではなく、showtimeテーブルを作成する最適な方法があるかどうか知りたいですか?
2
mohammad6006

新しいデータベースを設計するときは、それがどのように使用されるかを事前に知っておくことが重要です。もちろん、プロトタイピングやビジネスニーズの変化などにより、データベースがどのように使用されるかを正確に把握しておくことは困難です。

トランザクション処理システム用のリレーショナルデータベースを設計するための良い目安は、[システムが追跡する具体的なものはそれぞれ独自のテーブルを取得するであると想定することです。

状況に応じて次のERDを検討してください。

ERD

あなたの場合、VENUEsがあり、それぞれに1つ以上のSTAGEsがあります。各ステージには多数のSEATsがあります。ただし、シートのPRICEsを追跡する必要があるため、価格設定データを維持するために、シートはSECTIONsに配置されています。価格は、個々の座席レベルではなくセクションレベルで設定されます。曜日や時間帯によって価格が異なる場合があるため(たとえば、平日のマチネーは土曜日の夜よりも安い)、価格はショーの時間(EVENT)にも依存します。

複数の上映時間がありますが、複数の上映時間があるイベントには多くの共通点があるため、EVENTテーブルと子SHOWテーブルが必要です。これにより、表示とイベント(表示時間)の情報を第3正規形(3NF)に保つことができます。これは、常にトランザクションシステムデータベースから始めるのに適した場所です。

実際に各シートに誰がいるかを追跡したい場合、TICKETsとCUSTOMERsもデータベースに含める必要があります。

座席を行または列として追跡する方法に関する特定の質問に対処するには、座席を行として追跡することを強くお勧めします。 MySQLのようなリレーショナルデータベース管理システムは、データの行を簡単に処理できるように構築されています。座席を列として扱う場合は、ステージごとに座席が異なるため、ステージごとに異なる座席テーブルが必要になる可能性があります。そのため、クエリが非常に扱いにくく複雑になります。データにリレーショナルデータベースを使用する場合は、リレーショナルデータベースを使用してthingsを行に入れ、facts列の中のものについて。あなたのコードはより単純になり、あなたの人生はより良くなるでしょう。

2
Joel Brown