2009-07-27 10 views
0

ユーザが1つ以上の連絡方法(電子メール、電話、FAX、その他)を選択したいとします。そして彼らが他の人を選ぶならば、彼らは自分の一人の接触方法に入ることができます。これをデータベースに保存する最良の方法は何ですか? 3つの可能性があります。ユーザが入力したデータを使用して多対多ルックアップテーブルを実装する最良の方法

  1. オプションのユーザー入力値を格納するには、set datatype列と1つの "other_contact" varchar列を使用します。
  2. 多対多およびユーザーが入力した列を使用します。したがって、userテーブル、contact_methodテーブル、およびそれらを接続するuser_contact_methodテーブルがあります。 user.other_contactオプションのユーザー入力値を格納するvarchar列。
  3. 多対多を使用するだけです。 2と同じ設定ですが、ユーザーがcontact_methodテーブルにエントリを追加できるようにします。しかし、これは、「システム」の値を追跡するための列を追加する必要があることを意味します(これらはユーザーによって変更または削除できず、ドロップダウンリストにのみ表示されます)。さらに、ユーザが入力した値を変更できるように余分なロジックを追加する必要があります。

上記のコメントはありますか?

答えて

0

1人のユーザーと複数の連絡方法の可能性がある場合は、おそらく1対多の関係です。あなたが行っているところ私が見

users_table 
id INTEGER 
name VARCHAR 
etc. 

contacts_table 
user_id INTEGER -- foreign key on user.id 
contact_method ENUM('email', 'phone', 'mail', 'other') 
contact_address VARCHAR 
etc. 
+0

を(私は、多対多のどこにすることができます、ため、追加の複雑さのと、このようなモデルを問い合わせるのが遅くなります。避けるだろう)、と私はの複雑さを取り除く好き多対多のソリューション唯一の問題は、連絡方法も必要な別のテーブルがある場合です。私は、それぞれのために同様のテーブルを作成する必要がありますか? –

+0

高性能なselect文、したがってforeign_keysが必要な場合は、それぞれの表を作成できます。別の解決策は、 "user_id"の名前を "foreign_id"に変更し、追加の列 "table"を追加することです。 (2番目の解決策は何とか多相オブジェクト指向です。)ユーザーのcontacts_tableエントリの場合、foreign_idには[users id]が格納され、 "table"フィールドには文字列 "users_table"が格納されます。 – Beffa

関連する問題