質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.84%

  • MySQL

    5365questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • データベース設計

    128questions

    データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

複数のテーブルで重複するフィールドがある場合のテーブル設計

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 140

annderber

score 58

お世話になります。

テーブル設計で下図のようなテーブル構成があるとします。

イメージ説明

この2つのテーブルでは同じpermissionフィールドが重複しています。例では2つですが、
これが3つ4つあるとすると、権限テーブルを1つ作成して紐付けた方がいい気がしてきました。

考えたテーブル設計は下図になります。
イメージ説明

permissionsという全体のテーブルで共通の権限情報の管理テーブルを作成して、
必要なテーブルに紐付かせます。

問題だと感じるのはこの設計だと、テーブル数が単純に2nで増えることです。
またadmin_userテーブルには他に子テーブルがたくさんあるとすると、joinするテーブルが増えてパフォーマンスに影響が出てくる気もします。当然データ量とかにもよりますけど。

なので、ここまでする必要があるのかどうかの判断ができずに悩んでいます。

ここではあくまで例として、権限を出していますが、
特別に権限の管理として設計している訳ではないので、あくまで、
複数のテーブルに重複するフィールドがある場合の処理として考えています。

このあたりの設計例をご教授いただけるとありがたいです。
よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

ぱっとみおもったこと。詳細がわからないので間違っていたらすみません。

userテーブルと、permissonとパーミッションテーブルがあり
紐付けようにuser_permissonテーブルがある状態ですよね?

  • 前もお伝えしたかと思うのですが、さほど拡張性の必要がないなら
    user_permissionテーブルは
userid insert update delete
int bool bool bool

というもたせ方のほうがよいかもしれません。
(※boolはtinyint not nullでもOK)

  • とくにuserテーブルはuserid(int)とusername(varchar)の2つ項目をもつこと
    (useridはvarcharでも可)

  • user_permissionテーブルはidをプライマリにした上で
    useridとpermissioncodeで複合ユニーク属性にすること

  • permissionをグルーピングするならpermissionテーブルに各
    パーミッションの親groupidを保持して、groupテーブルとリレーションすること

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 16:55 編集

    コメントありがとうございます。

    おっしゃる通りのテーブル構成です。
    確かに前回した質問と似通ってしまっていますね。今回は複数のテーブルに跨がるチェックボックスの場合ということですが、これも変更率が低いならそれぞれテーブルに持ってしまっていいですかね。

    少し質問の内容と異なりますが、例えばuserテーブルに紐付く「コース」があったとして、
    そのコースには値段とかの情報があるので、別テーブルとして作成する。
    そしてコースはチェックボックスで複数選択可能としたら、リレーションを張るためにもuser_courseなどの子テーブルを作成する必要がでてきますよね。

    追記
    yambejpさんの設計例を少し読み間違えていました。
    >permissionをグルーピングするならpermissionテーブルに各
    >パーミッションの親groupidを保持して、groupテーブルとリレーションすること
    というのはpermissionテーブルが必要なテーブルすべてに共通のPKを生成するテーブルを1つ設けるということですか?

    キャンセル

+1

画面などの設計はどのようになっていますか。
例えば一覧(検索)画面などに、
ユーザの一覧と権限をすべて出す必要があるなら、
そこまでの正規化は行いません。
むしろ1テーブルに集約してしまったほうがいいかと思います。
あくまで1つの例として。

カラム名 属性 備考
id PK int サロゲートキー
type int [1:admin_user/2:group]
name varchar
permissions_r bool
permissions_w bool
permissions_x bool

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/11 17:11 編集

    コメントありがとうございます。

    すいません。私の例が悪かったです。
    省略してしまっていますが、2つのテーブルが同じフィールドを持っている想定ではないです。
    あくまで別テーブルとして扱えるように設計したいです。

    キャンセル

  • 2018/01/11 17:28

    他に別々のカラムも持っているということですか。

    同じ意味を持つデータが他テーブルに散らばっているのは
    設計的にイケてないかと。。。
    yambejpさんのテーブル構成のほうがよさそうですね。

    そもそもadmin_userテーブルとgroupテーブルで権限が分かれて作られた経緯など、
    かなり具体的な話になってしまいます。

    要件が出てくるたびに考え直すんですが、
    最初に書いたように、
    他の要件(画面での表示など)を容易に満たせる範囲内で正規化されるのがいいと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.84%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    xcodeでの画面サイズ変更方法

    swiftでサンプルコードを写しているのですが、参考書を今まで放置してたのでxcodeのバージョンが違うので画面サイズ変更の方法がわからないです。 simulatorでの表示画面

  • 解決済

    ACCESS クエリでの一部重複?の除外方法について

    前提・実現したいこと こんにちは、質問タイトルが適格でないかもしれませんが宜しくお願いいたします。 通販事業をしており、商品の仕入から販売までのデータベースをACCESSの

  • 解決済

    cloud9のコマンドラインの出し方

    わからないこと cloud9を使っていて、コマンドラインを消してしまって出し方がわからなくなってしまいました。 いろいろ探してみましたが見つかりませんでした。 とても

  • 解決済

    背景色の有無と::

    左上の図でleftの右とrightの右の水色が表示されません。特にエラーもありません。 宜しくお願い致します。 リンク内容 <!DOCTYPE html> <

  • 受付中

    ER図について

    つぶやきアプリを作っているのですが、 ER図を作るとする例えばどんなものがありますか?? サンプル程度でいいので教えていただきたいです

  • 解決済

    ASUS ZenPadで、Camera2APIで、1分動画を2時間分撮影したいです。

    Nexsus 5Xでは、1分動画を、2時間ぶん、撮影することができました。 しかし、ZenPadでは、エラーが出ます。 このようなエラーが繰り返して表示されます。 参

  • 解決済

    railsのサーバー起動画面

    railsを使っているのですが、サーバーを立ち上げる時この画面以外にもう1パターンありますよね? この違いってなんなんですか?バージョンの違いですか?

  • 解決済

    StackView内に配置したラベルの高さを文字サイズをそのままに可変にしたい

    前提・実現したいこと 下の画像のようにStackViewを配置しているのですが、ラベルの高さが可変となりません。 UILabel - Linesは2に設定しているので2段には対応し

同じタグがついた質問を見る

  • MySQL

    5365questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • データベース設計

    128questions

    データベース設計はデータベースの論理的や物理的な部分を特定する工程です。