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

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

ただいまの
回答率

88.78%

データベースの設計につきまして。権限に応じてユーザーモデルは分けるべきなのか?

解決済

回答 3

投稿

  • 評価
  • クリップ 4
  • VIEW 3,955

takeotakeo

score 58

管理者と普通のユーザーに別の権限を与えるにあたって、

実現方法1:
User データベースと Adminデータベースを作る

実現方法2:
User モデルに、is_adminカラムを作り、adminの場合はtrue にする。

などがあると思いますが、
大規模アプリケーションにおける2のデメリットを伺いたく存じます。
自分はずっと、2のやり方はあまり好ましいものではないのだと思い込んで来ましたが、その具体的なデメリットが分からなくなって来ました。

たとえば、多くの人が使っているwordpressでは2の方法が取られていると思います。
実装的には2の方が簡単です。
どちらの方が広く使われている手法なのか?大規模アプリケーション(1万人以上が登録利用する想定)ではどうか?など伺いたく存じます。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

+1

うーん…むしろ1の方にデメリットしか無いように思うのですが、1のメリットをお伺いしたいです。

大規模案件でも2に近い形を採用しますね。
まず、内部的なDBの構造はID管理サービスで隠蔽します。
または、そもそも外部のサービスを使います。

私はOpenIDMを使っています。
Users,Roles,User Rolesの実装を持つOSSのID管理マネージャです。
※mingosさんの言っているWordpressと同じ構造を持ってます

仮に自分で実装するとしてもDBは公開しませんし、管理面から考えて単一データベースに実装します。
ユーザーデータベースはそれ単体で十分なサービス足りえます。
セキュリティや厳格さ云々はサービスとそのコンテナでシャットアウトします。

物凄いセキュアなんです、っていったところで、ユーザー情報の取得口は通常一つですから、別々のデータベースに存在していること自体はセキュリティに寄与しないと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/11 18:38

    有難うございます。そうなのですね。

    http://qiita.com/Yama-to/items/54ab4ce08e126ef7dade
    >例えばセキュリティ的にuserとadminの管理はテーブルごとまるまる別個にしたいという場合だったり

    こういった記述をちょくちょく見かけるので、セキュリティに敏感にならなくてはいけない場合はモデルを分けているのだと誤解しておりました。

    実際に大規模案件に携わられている方のご意見、参考になります。有難うございました。

    キャンセル

  • 2017/04/11 19:49 編集

    いや、自分の関わった実装がすべてというわけではないので。(結論早くないですかね!)

    qiitaのサンプルはどちらかっていうとBtoCとBtoBが別のサービスで「ユーザーモデル」と「企業モデル」を分けて考えるかという話だと思います。
    自分は単一のBtoBのシステムなので、上記のモデルで分けない場合もあるのかちょっとわかりません。
    (ただ、一元管理するんだったら結局単一サービスな気はする…面倒そうですし)
    「権限」って言われた時の発想が単一システム内の権限管理になっていたので。

    別々の入り口を持ち、同一スキーマ上で管理したものを仮想的に別のEntityとして扱う場合、むしろ話が複雑になります。

    ユーザーデータベースでやるかどうかはわからないですが、例えば登録している人物データと組織データ両方を管理する単一サービスをパーティパターンを用いて実装しています。

    自分は似たものは同じような場所で管理すべきっていう思想があるので、これも一つのコンウェイの法則なのかなと思います。エンドユーザをパーソナルとエンタープライズ別々に管理してる組織が作ったら別のDBになってそうです。

    キャンセル

  • 2017/04/11 19:52

    例えば、SkypeアカウントとMicrosoftアカウントみたいに、単一の出入り口、複数のユーザーアカウントサービスっていうものも実在していますしね…ただあれは歴史的な経緯だと思ってますが…。

    キャンセル

+1

データベースにはテーブル単位・列単位で権限をかけられるので、管理者用アカウントを別テーブルにした場合、データベースレベルでユーザーからは管理者テーブルを読み書き不可にしてしまうこともできます(もっとも、そこまで厳格に行うことは多くないでしょうが)。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/09 23:34

    ご回答有難うございます。
    やはりそれが一番大きな理由なのでしょうか。
    >もっとも、そこまで厳格に行うことは多くないでしょうが
    そうなのですね。意外でした。

    キャンセル

+1

1、2の方法に加えて3つ目の方法として
ユーザ(users)、権限(roles)、ユーザ・権限(user_roles)の3つのテーブルを用意するという方法もよく使われると思います。

Wordpressの設計を調べてみたところ、ユーザテーブルには権限に関する情報を持ちません。
ユーザは、権限グループに所属するだけです(特権管理者、管理者、編集者、投稿者、寄稿者、購読者)。
権限グループに対してデフォルトの権限が割り当てられています(activate_plugins、create_users、delete_themesなど)

詳細は、こちらのページをご覧ください。
ユーザーの種類と権限 - WordPress Codex 日本語版

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/09 23:32

    ご回答有難うございます。wordpressについて調べてくださったとのこと、有難うございます。リンク拝見します。
    確かにその方法の方が拡張性が高いですよね。

    キャンセル

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

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

関連した質問

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