- ベストアンサー
DBの設計について
MySQLの設計について質問があります。 まずDBの設計ですが以下のような場合どのようにすればよいのでしょうか? 1. 商品情報が数十万件あり、商品DBを作ってその中に全商品を登録するテーブルを作る 2. 各会員が上記の中から自分が扱いたい商品を登録するテーブルが必要 このとき、2.のテーブルは、 A. 1.のDBの中に作る B. 各会員のDBを作ってその中に扱いたい商品のテーブルを作る C. 会員DBを作って会員ごとのテーブルを作る のどれが正しいのでしょうか?各会員が扱う商品数も数万~数十万件になります。 どうぞよろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
セキュリティ上、ある会員が他の会員の扱っている商品を簡単に見ることができていいのでしょうか? また、会員というのが商店で、複数の商店の情報を比較しながら買い物する顧客が別にいる、 という話では、 ある会員が他の会員の扱っている商品を簡単に見ることができてはいけないが、 ある顧客は、複数の会員の扱っている商品を簡単に見ることができないとまずいです。 というのも要件の1つにはいるのですが。 A. 1.のDBの中に作る 方法が2通りあって A-1.同一DBで複数テーブルにする。 複数の会員が扱っている商品をみるのにはいささか不便。 A-2.同一DBの同一テーブルにする。 この件数から見ると、会員の数×数万~数十万件の商品というレコード数になり、 ちょっとレスポンスが心配。 会員の数が少なければレスポンス対策としてあえて、横持ちする手はありますけどね。 (拡張性や正規化という点から言うと好ましくないですが。) 例)商品コード,会員1,会員2,会員3,・・・ 会員1が1なら会員1が扱っており、0なら会員1は扱っていない。 B. 各会員のDBを作ってその中に扱いたい商品のテーブルを作る C. 会員DBを作って会員ごとのテーブルを作る BとCの差があまりなくて、 Bのメリットは、サーバを分割しやすいという点と、会員間でデータを見れなくしやすいという点で、 デメリットは、商品を減らしたいときに、全会員のDBに接続して、1件ずつ消さなくてはいけない (CならDB接続は1回ですむ。)、サーバを分割しにくい、複数の会員のデータを見るのが面倒 等ですね。 Aは、BやCと違って、サーバを分割なんて難しいし、 会員間でデータを見れなくしにくい(作りこみがいるというだけ)、 一方で、商品を減らすのはすごく簡単。複数の会員のデータを見るのも簡単。 といったところが長短として挙げられます。 どれを重視するかによって答えは変わってくると思います。 (あと用意できるDBサーバの性能と。)
その他の回答 (2)
- maiko0318
- ベストアンサー率21% (1483/6969)
>Bは「各会員それぞれの専用のDB 会員数は何人ぐらいですか? 500も1000もテーブルがあって ある商品を扱いたい会員は? というようなリクエストがあったら対応できますか?
お礼
ありがとうございます。 会員数はそれほど多くはないと考えています。 多くても100人くらいです。 >ある商品を扱いたい会員は? >というようなリクエストがあったら対応できますか? そういう使い方を考えていませんでした…。 今のところそのリクエストの必要性はないのですがもしかしたら今後そのような 要求がでてくるかもしれませんね。
- maiko0318
- ベストアンサー率21% (1483/6969)
>B. 各会員のDBを作ってその中に扱いたい商品のテーブルを作る 1会員番号に複数レコードがあります。 会員番号、商品番号 1 2 1 3 2 1 2 2 2 5 ・ ・ ・ ・ ・ ・ C:の会員DBを作るなら、会員番号に、住所や名前を付加したテーブルにします。
お礼
ありがとうございます。補足ですが Bは「各会員それぞれの専用のDBを作って、その中に会員が扱いたい商品テーブルを一つ作る」 Cは「会員DBを一つ作って、その中に各会員それぞれの商品テーブルを作る」 という感じです。 住所や名前を付加したテーブルは商品テーブルとは別のテーブルにしようかと思っています。
お礼
ありがとうございます。 とても詳しく説明してくださって助かりました。 そしてどれも正解というのはないのですね。 それぞれの環境によってどれがいいかを決める感じですね。 会員数は多くても100人くらいになると考えています。 A.に関してはやはり現実的ではないですね。 B.に関して「デメリットは、商品を減らしたいときに、全会員のDBに接続して、1件ずつ消さなくてはいけない」というのは、消す必要はないかと思っています。 単純に会員が使う商品がDBと大元の商品DBに存在しなければ存在しないという処理だけで良いかなと。 ただ、「B.各会員が扱う商品を登録したDBを会員数分作る」と「C.会員DBを一つ作ってその中に会員テーブルを会員数分作る」では、BのDBは会員専用なのでほぼアクセス数は一つですが、CがDBに同時アクセスする数は最大で会員数分だけあります。 そうするとレスポンス的にやはりDBを別けたほうが良いのでしょうか? いちおうB.かC.で検討しています。