初めて質問いたします。下記につき悩んでおりまして先輩方のお考えを拝借できればと思います。どうぞよろしくお願いします。
概要
laravelにて作成中の業務系システムのデータベースの設計につき、システムを利用するユーザ毎にデータベースを分けるべきか、或いは同じデータベースを利用するべきかで悩んでいます。
何も調べずに考えた段階ではユーザ毎にデータベースを分けるつもりでした。
ですが調べてみたところ、過去に同じような趣旨の質問(https://teratail.com/questions/53161)があったのでそこを閲覧したりStackOverflowなども見てみましたが、いずれもインスタンスを分ける考え方には否定的な回答が多い印象でした。
いずれも4年以上前のもので少々時間が経っている事から、最近の事情はどうなのであろうと思いましての質問です。
現在においてもやはりデータベースをユーザ毎に分けるという考え方はアンチパターンなので考え直すべきなのでしょうか?
今回の前提条件
・ログイン管理には別のインスタンスを利用している。
・各ユーザは店舗を複数(1~200程度)持っており、データは店舗毎に、或いは任意の複数店舗を纏めて集計する必要がある。また店舗数は任意のタイミングで増加していく。減る事は基本的に無い。
・店舗番号と店舗名称を紐づけるテーブルが必要。
・各店舗はユーザが独自に設定できる2つのグループの両方に属している。その2つのグループを管理するテーブルが必要。
・各店舗から上がってくるデータは複数種ありそれぞれにテーブルが必要。
・各テーブルには最小で1店舗ごとに1日1レコード、最大で1000レコードほど追加される。登録した後に削除するレコードは基本的に無い。
・各ユーザが利用するテーブルの構造は基本的に同じ。ただしユーザが利用する機能によっては不必要なテーブルや追加で必要なテーブルもある。
・ログインしたユーザは自分のデータのみ閲覧し、他のユーザのデータを直接的、間接的にも利用する事はない。
・ユーザには親ユーザと子ユーザがあり、子ユーザは親ユーザの閲覧できる範囲を上限に閲覧できる範囲を設定できる。
・アプリケーションの仕様の変更により、必要なデータが増加する可能性がある。
何故当初の考えに疑問を持ち質問をしたのか。
色々調べている過程でデータベースを分けるデメリットとして下記のような事かと自分なりに解釈しました。
1.)テーブルの追加、変更などの際の管理が煩雑になる。
2.)ユーザ間を跨ったクエリが不可能になる。
3.)速度という意味では適切なインデックスが貼ってあれば分ける事にメリットは別にない。
その為に色々調べている過程で、そもそもデータベースインスタンスは分けるべきではないという回答が多かったのですが、インスタンスを纏めるとなると今度は下記の点が気になります。
1.)テーブルによってはサイズが大きくなりすぎるのではないか。
2.)アプリケーションに何らかのミスがあった際、他ユーザのデータを見れてしまう可能性が高くなる。
3.)ユーザが住み分けられている方が有事の際に分かりやすい、対応しやすい。特定ユーザへのサービス終了の際などもわかりやすい。(という点が失われる)
今回の私のケースではどうするのがベストなのか、色々悩んでも考えが纏まらず困っております。どうぞよろしくお願いします。
回答5件
あなたの回答
tips
プレビュー