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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DataSet

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

MySQL

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

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

3回答

8212閲覧

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

takeotakeo

総合スコア58

DataSet

DataSetは、ADO.NETアーキテクチャのコンポーネントです。データベースから取得したレコードをメモリ領域に格納するクラスを指します。データの保持やテーブル間のリレーション・制約といった保持も可能です。

MySQL

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

MongoDB

MongoDBはオープンソースのドキュメント指向データベースの1つです。高性能で、多くのリトルエンディアンシステムを利用することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

4クリップ

投稿2017/04/09 09:35

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

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

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

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

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

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

投稿2017/04/11 09:27

haru666

総合スコア1591

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takeotakeo

2017/04/11 09:38

有難うございます。そうなのですね。 http://qiita.com/Yama-to/items/54ab4ce08e126ef7dade >例えばセキュリティ的にuserとadminの管理はテーブルごとまるまる別個にしたいという場合だったり こういった記述をちょくちょく見かけるので、セキュリティに敏感にならなくてはいけない場合はモデルを分けているのだと誤解しておりました。 実際に大規模案件に携わられている方のご意見、参考になります。有難うございました。
haru666

2017/04/12 08:42 編集

いや、自分の関わった実装がすべてというわけではないので。(結論早くないですかね!) qiitaのサンプルはどちらかっていうとBtoCとBtoBが別のサービスで「ユーザーモデル」と「企業モデル」を分けて考えるかという話だと思います。 自分は単一のBtoBのシステムなので、上記のモデルで分けない場合もあるのかちょっとわかりません。 (ただ、一元管理するんだったら結局単一サービスな気はする…面倒そうですし) 「権限」って言われた時の発想が単一システム内の権限管理になっていたので。 別々の入り口を持ち、同一スキーマ上で管理したものを仮想的に別のEntityとして扱う場合、むしろ話が複雑になります。 ユーザーデータベースでやるかどうかはわからないですが、例えば登録している人物データと組織データ両方を管理する単一サービスをパーティパターンを用いて実装しています。 自分は似たものは同じような場所で管理すべきっていう思想があるので、これも一つのコンウェイの法則なのかなと思います。エンドユーザをパーソナルとエンタープライズ別々に管理してる組織が作ったら別のDBになってそうです。
haru666

2017/04/11 10:52

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

0

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

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

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

投稿2017/04/09 14:27

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takeotakeo

2017/04/09 14:32

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

0

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

投稿2017/04/09 14:10

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takeotakeo

2017/04/09 14:34

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問