質問: 現在イベント検索と申し込みを行えるアプリケーションをRuby on Railsで作成しています。 DB設計で悩んでしまっているので、アドバイスを頂けたら幸いです。 概要---イベントと登録カスタマーのDB上の関係--- --------------------------- 以下のようにイベントテーブルとカスタマーテーブルがありまして、 多対多の関係になります。 中間テーブルはチケットテーブルになっていて、 イベント参加申し込みをされた時点で、チケットを発行(=中間テーブルにレコードを作成)します。 ![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/364c96861be37c5078f43049e0beecf2.jpeg) 問題点---非登録カスタマーどうする? ------------------- しかし、イベントに参加申し込みできるのは、登録したカスタマーだけではなく、 今回だけ参加するという非登録のカスタマーも含めることにしました。 その場合登録済みカスタマーを保存しているカスタマーテーブルだけでは不十分なため、 DB設計を見直さないといけなくなりました。 どのようにすれば効率的なDB設計になるでしょうか? ##### 前提条件 ・現在のカスタマーテーブルにはdeviseを使用しているため、メール・パスワード設定なしのレコードの追加はできない。 ##### 現在考えていること 1ゲストテーブルを新たに作り、1回限りの非登録カスタマーはそこに追加していく。 2チケットテーブル(中間テーブル)をcustomer_idなしでレコード追加できるようにして、カスタマーテーブルと同じname,email,sexなどのカラムを持たせる。 ### 開発環境 ruby '2.5.1' rails '5.2.2'
回答: 私が今考え付いたもので、これがベストである気はしませんので参考までに。 きっとこの後、もっと優秀で経験豊富な方が良い方法を提案してくれるかもしれません。 #### 中間テーブルにguest_idを追加し以下構成に * event_id * customer_id * guest_id * number (これは何・・・?) #### 処理方法 > > 1ゲストテーブルを新たに作り、1回限りの非登録カスタマーはそこに追加していく。 > > 2チケットテーブル(中間テーブル)をcustomer_idなしでレコード追加できるようにして、カスタマーテーブルと同じname,email,sexなどのカラムを持たせる。 > > > ほぼこの通りで、中間テーブルのcustomer_idとguest_idにnullを許可する 検索したい時は、guestを検索したければ customer_id is null、customerを検索したければその逆を。 あんまりイケてる気はしません。 もしくは(追記) eventとguest用の中間テーブルを別で作った方が良いかも