質問: グループ3社で対象になるユーザがどの会社の権限許可があるかの設定を設けようと思っているのですが、会社ごとの許可フラグをカラムとして列で持つか、 それともカラムを会社IDとし、レコードとして持つかどどちらの方がようか迷よっています。 どちらが良いか判断の基準やデータ上のベストプラクティスはありますでしょうか、件数が多いので検索時のスピードも気にしています 会社の追加は稀にある予定で、列で持った場合の最大数は5万くらいです。 ``` データイメージ 列 user_id,a_comp_flag,b_comp_flag,c_comp_flag,rest_date suzuki,1,0,1,2016-12-12 行 user_id,comp_cd,rest_date suzuki,sample_company,2016-12-12 suzuki,syousya_company,2016-12-12 ```
回答: あらゆるリレーショナルデータベースは、正規化されたデータを扱うことに最適化されています。 このケースは典型的な多対多結合ですので、中間テーブル(permissionテーブル)を持つのがベストプラクティスです。 またユーザや会社は名前が変わることが普通にあります。 ですから、プライマリーキー(id)と検索用のインデックス(code)は別に登録するほうが扱いやすいです。 以上を踏まえるとこんな感じになります。 ``` userテーブル id, code, name1, suzuki, 鈴木太郎 2, yamada, 山田花子 companyテーブル id, code, name1, sample_company, サンプル株式会社 2, syousya_company, 株式会社勝者 permissionテーブル user_id, company_id1, 1 1, 2 ``` 詳しくは、"RDB 正規化" や "RDB 多対多結合" でwebページを検索してみてください。