質問: ご挨拶・経緯 ------ 閲覧ありがとうございます。 現在、社内ではなく公開サービスとして、自身の営業履歴を残せるシステム(ではないですが近い物)を開発しております。 まだDB設計の段階ですが、悩む点があり、また私は経験がとても浅いので、ご経験等踏まえご回答頂けると幸いです。 検討事項 ---- ユーザーの行った営業について、会社名を入力する項目を作りたいのですが、 会社テーブルを全ユーザー共通(**例A**)にするか、ユーザーごと(**例B**)にするかで悩んでおります。 尚、例Aと例Bは、意味としてはまったく同じデータベースです。 要求定義 ---- 設計にあたって必要そうな要求定義は下記です。 * ユーザーは営業履歴をフォームに入力する際に会社名を一覧から検索,選択し、該当が無ければ自身で会社名(営業先)を新規登録をします * 1つの営業先について営業に行った事のユーザーを一覧する機能は無く、将来的にもあり得ません (i.e. ある1つの営業先について、ユーザーが異なれば表記が異なっても問題無い) * 1人のユーザーについて、1つ営業先から過去の営業一覧を取得する機能は必要です (i.e. 1人のユーザーにおいては、ある1つの営業先について常に同じ名前を設定しなければならない) ### 例A **users** | id | name | | --- | --- | | 1 | 山田 | | 2 | 斎藤 | | 3 | 鈴木 | **sales** | id | user_id | company_id | comment | | --- | --- | --- | --- | | 1 | 1 (山田) | 1 (株式会社あいうえお) | 絶好調でした | | 2 | 3 (鈴木) | 1 (株式会社あいうえお) | 断られました もう一回行ってきます | | 3 | 2 (斎藤) | 2 (ほげぴよ株式会社) | 後日連絡が来るそうです | | 4 | 3 (鈴木) | 1 (株式会社あいうえお) | OKでした!! | **company** | id | name | | --- | --- | | 1 | 株式会社あいうえお | | 2 | ほげぴよ株式会社 | 例Aは会社表記が統一されますが、全ての会社の表記を一定にする措置が必要です。ユーザーが退会時にデータを削除する必要が無く、その会社レコードを将来的に再利用できます。 ### 例B **users** | id | name | | --- | --- | | 1 | 山田 | | 2 | 斎藤 | | 3 | 鈴木 | **sales** | id | user_id | company_id | comment | | --- | --- | --- | --- | | 1 | 1 (山田) | 1 (株式会社あいうえお) | 絶好調でした | | 2 | 3 (鈴木) | 2 ((株)あいうえお) | 断られました もう一回行ってきます | | 3 | 2 (斎藤) | 3 (ほげぴよ株式会社) | 後日連絡が来るそうです | | 4 | 3 (鈴木) | 2 ((株)あいうえお) | OKでした!! | **company** | id | user_id | name | | --- | --- | --- | | 1 | 1 | 株式会社あいうえお | | 2 | 3 | (株)あいうえお | | 3 | 2 | ほげぴよ株式会社 | 例Bは、ユーザーごとに表記のぶれがあっても問題なく(自分さえわかれば問題ない)、また検索も自身が実際に行った事のある会社(営業先)しか出てこないので簡単です。 最後に --- 自身で考えているサービスなので、そもそも要求仕様、ここが変だよ、とか様々な角度からの突っ込み、アドバイス、ご教授をよろしくお願いいたします。 追記 -- ご回答ありがとうございます。少し質問文が分かりにくかったようで申し訳ございません。 サービスは営業管理システムというよりかは、会社としての営業活動に関係ない、個人個人の営業日記のようなものを想定しています。
回答: company テーブルなら、会社についてだけの情報を持つべきです。 つまり A 案です。 もし、B 案のようにするなら、次のような構造になると思います。 * user: user_id, name * campany: company_id, campany_name * sale: sale_id, user_id, company_id, comment 実は列の構造は A 案と同じです。 違いは、 campany テーブルの制約です。 A 案では company_name は 全体でユニークにすることが必要です。 B 案では、その制限をしないようにします。 ユーザーが営業記録を登録する際は、 ユーザーのセール一覧から company_id, company_name の一覧を取り出してそれを一覧表示します。そのなかから会社を選択して営業記録を登録するようにします。 一覧に該当する会社がでてこない(初めてその会社へ営業した) 場合は、company テーブルに新規登録してから、その会社を選択して営業記録を登録するようにします。