• ベストアンサー

利用者数10万のデータベース設計について

WEB上で利用者数10万のマイページ機能をもつようなビジネスサイトを構築しようと考えています。 ユーザーのID,PASS管理と ユーザーごとのマイページの中にスケジュール管理機能、顧客管理機能 を設けます。 このような大規模なデータベースの設計例を教えていただけないでしょうか? データベースにはMySQLを使用しようと考えています。 ユーザーのID管理は一つのテーブルじゃ無理ですよね? その場合どのように分ければいいのしょうか? ユーザーごとのマイページはユーザーごとにスケジュールテーブルなどを 作るべきなのでしょうか? MySQLの物理的最大DB,テーブル数の制限などあるのでしょうか? 私自身はデータベースプログラムが出来ないため設計の部分でお教えいただけたらと思います。

質問者が選んだベストアンサー

  • ベストアンサー
  • okdt
  • ベストアンサー率100% (4/4)
回答No.2

MySQLで顧客情報などが10万レコードという規模は特別大きくありません。性能的にはまだまだ楽々いけちゃうでしょう。ユーザのID管理を分散することを考えるより、バックアップレプリケーションなどの運用に力を入れるほうが実際的です。 あえて検討項目として考えるとすると、(1)データベース部分のディスク容量 (2)同時接続数(想定)対応のコネクション確保 (3)その前提でのメモリーサイズの確保 だと思います。 MySQLではインデックスのキャッシュなどのサイズを指定できますから、パフォーマンスチューニング部分で改善できることは十分あると思います。 参考までに、その手のセミナーもありますよ。

参考URL:
http://techstyle.jp/

その他の回答 (1)

  • x-game
  • ベストアンサー率42% (80/189)
回答No.1

こんにちは. DBの設計は難しいですよね.私なら下記のように3テーブルに分けると思います. ■ログインテーブル  内部ID(連番), ユーザーID, パスワード ■顧客情報テーブル  ログインテーブルの内部ID, 名前,住所,・・・ ■スケジュールテーブル  ログインテーブルの内部ID, 日付,スケジュール内容 ログイン時に見に行くテーブルによけいなデータを入れたくないのでログインテーブルは別にもうけます.顧客情報テーブルは,ログイン時に内部管理しているIDを入れると,ログインテーブルと顧客情報テーブルの連携が可能です.スケジュールテーブルも同様で,ログインテーブルの内部IDを入れることで関連づけることができます.このテーブル設計ならユーザーごとにスケジュールテーブルをもうける必要はありません.インデックスをはる位置に気をつければ,なかなか快適に動くと思います.

snake103
質問者

補足

参考になります。ありがとう御座います。 別件になるのですが、x-gameさんはオンラインショップのDB設計はご存知でしょうか? http://www.muji.net/のような一般的なオンラインショップのDB設計例など お知りでしたら教えて下さい。 (受注伝票、顧客管理、入金管理など)

関連するQ&A

  • データベースの設計について教えてください。

    データベースの設計について教えてください。 基本的な質問ですみません。宜しくお願いいたします。 単純なテーブルで表現しますが、 パターンA、Bのどちらのテーブルで設計するのが良いのでしょうか。 DBはmysqlで5000万件のデータで検索のみのデータベースです。 【前提】 ユーザは複数のメールアドレスを持ちます。 画面から、このユーザのもつメールアドレスを表示させる仕様だとします。 【userマスタ】 (PK)ユーザID   ユーザ名   会社名 <パターンA> 【mailテーブル】 (PK)ユーザID (PK)ユーザメールアドレス   モバイル用アドレス <パターンB>  【mailテーブル】 (PK)ユーザメールアドレス   モバイル用アドレス   ユーザID ←インデックスをはります。

    • ベストアンサー
    • MySQL
  • 2パターンのデータベース設計で最適なほうはどちら?

    こんにちは。 データベース設計をするにあたり、迷っています。 言語はRuby on rails、DBはMysqlです。 たとえば日記サイトを作るとして (1)テーブル : users , diariesがあって、それぞれのidはuser_diaries というリレーション用のテーブルを作って持たせる (2)テーブル : users , diariesがあって、diaries にuser_id というカラムを持たせる というような作り方ができると思うのですが、どちらが優れていると言えるでしょうか? 決めの問題でしょうか? 将来的に大きなサイトになっても大丈夫なようにしておきたいです

  • データベースの設計方法について

     全くの初心者で、いろいろな書籍を参考に販売・在庫管理データベースをつくりたいと勉強しています。  環境はMicrosoft SQL Server 2008 R2 EE をサーバーにインストールして、別のクライアントパソコンから SQL Server Management Studio でデータを作成しています。  データベースとは閉じた空間で、1つのデータベース内で必要なテーブルを全て用意するものと思っていました(参考にした書籍もそうなっていました)。  しかし、ネットでいろいろ調べるとインスタンス内に複数のデータベースを作成し、それらデータベース内のテーブルは相互接続可能出来るみたいでした。  となると、データベースを設計する際 <販売管理データベース>  ・顧客情報テーブル  ・商品情報テーブル  ・在庫テーブル  ・単価テーブル  ・請求データテーブル  ・伝票テーブル  ・etc.  と1つのデータベースに全てのテーブルを用意する設計では無く <販売管理データベース>  ・伝票テーブル  ・請求データ  ・etc. <顧客情報データベース>  ・顧客情報テーブル  ・単価テーブル  ・etc. <商品情報データベース>  ・商品情報テーブル  ・在庫テーブル  ・etc.  みたいに、機能ごとにデータベースを分けて、インスタンス単位で1機能(もしくは複数機能の実装)の設計でも良いのでしょうか?  プログラム言語の、プロジェクト=インスタンス、クラス=データベースみたいな考え方が出来ればと思っています。  この方法が正しいのか誤りなのか、そもそも理解に誤りがあるのか全く見当が付きません。  一般的にはどのようにするものなのでしょうか?

  • 複数のデータベースを使う場合

    php4 + MYSQL4.0.2で作業しています。 1つのサーバーにある、複数のデータベースに接続する方法を教えてください。 DB1:テーブルhoge(ID、name) DB2:テーブルhogehoge(ID, hogeID, comment) このような場合、データベースが全てDB1に入っているとすれば、 $con = mysql_connect(host, user, pass); sql="SELECT name, comment" . " FROM hogehoge INNER JOIN hoge ON hogehoge.hogeID = hoge.ID"; $rst = mysql_db_query(DB1, $sql, $con); $col = mysql_fetch_array($rst); print($col['name'] . $col['comment']); となりますが、 テーブルhogeとhogehogeが、異なるデータベースに存在する場合はどのようにすればよいのでしょうか? 以上、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • 同じサーバーで、異なるデータベースを同時に開くことはできますか?

    1.タイトルの通り、同時に開くことができますでしょうか? 日本PHPユーザー会ホームページでは以下の方法でできるとの回答があります。 $con1 = mysql_connect(localhost, user_id , pass); $con2 = mysql_connect(localhost, user_id , pass); mysql_select_db("db1",$con1); mysql_select_db("db2",$con2); ======================================== db1 user_table user_id(int),user_name(var) ========================================== db2 main_table main_id(int),user_id(int) ======================================== $sql_user_name = "SELECT user_name FROM user"; $result_user = mysql_query($sql_user_name,$con1); $row_user = mysql_fetch_array($result_user); echo $row_user[user_name]; のようにやっても mysql_fetch_array()がでます。 mysql_queryは最後の接続を活かすとなっているのでこの部分の書き方を教えてください。 2.できたとしてリレーションを行うことができますでしょうか? つまり $sql_user_name = "SELECT user_name FROM db1.user_table,db2.main_table WHERE db1.user_table.user_id = db2.main_table.user_id" というようなことはできますでしょうか? 長文で申し訳ありませんが、どうかよろしくお願いします。

    • ベストアンサー
    • MySQL
  • データベースの設計について少し疑問が出たので投稿しました。

    データベースの設計について少し疑問が出たので投稿しました。 数千万レコードを取り扱う場合、以下のどの構成が一番クエリを早く実行できるのでしょうか? 1.1つのデータベースに1つのテーブルを構築して全てのレコードを格納。 2.1つのデータベース内に複数のテーブルを構築して、レコードを分散して格納。 3.複数のデータベースにそれぞれ1つのテーブルを構築して、レコードを分散して格納。 データベースはMySQLです。 参考までに、ご意見をお聞かせいただければと思います。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • データベースの設計について

    現在PostgreSQL(ver 8.4)を使ってちょっとしたシステムの構築を計画していますが、データベースの設計に関して広くアドバイスを頂きたいです。 ユーザーの入力データをDBで効率よく管理したいと考えています。 例えば、次のようなテーブルを作るとします。 userテーブル id | name ---+------------- 1 | 山田太郎 2 | 高橋次郎 .. | ............. .. | ............. emailテーブル id | address ---+------------------------------ 1 | yamada@mail.com 2 | takahashi@mail.com .. | ................................. .. | ................................. この様な複数のテーブルにユーザーの入力を受け、1対1に対応するIDを振って名前やアドレスなどのデータをリアルタイムで挿入していく場合、どのようなテーブルを用意し、プログラムを組むのが適切なのでしょうか? 具体的には、PerlでCGIをつくり、ブラウザ上などからユーザーの入力したデータを取得してPostgreSQLに次々挿入していく形にしようとしています。 具体的なPerlのコードを書いていただけると助かるのですが、他の言語のコードでも一向に構いません。 今のところ、自分で考えたものとしては、 create table user( id serial, name text); create table email( id serial, address text); とテーブルを用意し、 Perlコードの概要は use DBI; # *実際にはユーザーの入力値から値を得る $input_user = 'name_hogehoge'; $input_email = 'address_hogehoge@mail.com'; # DBとの接続 $dbh = DBI->connect("dbi:Pg:dbname=hogehoge", ......); # プレースホルダの準備 $sth_user = $dbh->prepare("INSERT INTO user (name) VALUES(?)"); $sth_email = $dbh->prepare("INSERT INTO email (address) VALUES(?)"); # SQLの実行 $sth_user->execute("$input_user"); $sth_email->execute("$input_email"); # コミット $dbh->commit; といった感じで考えていました。しかしidの対応が確実に取れるかなど不安な点がありますので、アドバイスいただけたらと思います。 もちろんこの方法に固執する必要はなく、結果的に同じようなテーブルが得られれば問題ないです。 長々と失礼致しました。

  • 異なるデータベース間のリレーション

    phpmyadmin上の異なるデータベース間のテーブルでリレーションをかけたいのですが、うまくいきません。 new_linkフラグをtrueにすることで異なるデータベースを開くところまではできました。 アドバイスいただけないでしょうか。 ※DB1の中にtable1が、DB2の中にtable2がある //失敗する $con1 = mysql_connect("localhost",username,pass); mysql_select_db('DB1',$con1); $con2 = mysql_connect("localhost",username,pass,true); mysql_select_db('DB2',$con2); $sql = "select * from table1,table2 where table1.id = table2.id"; $result = mysql_query($sql) or die(mysql_error()); メッセージ⇒Table 'DB2.table1' doesn't exist //これは成功する $con1 = mysql_connect("localhost",username,pass); mysql_select_db('DB1',$con1); $con2 = mysql_connect("localhost",username,pass,true); mysql_select_db('DB2',$con2); $sql1 = "select * from table1"; $result1 = mysql_query($sql,$con1) or die(mysql_error()); $sql2 = "select * from table2"; $result2 = mysql_query($sql2,$con2) or die(mysql_error());

    • ベストアンサー
    • MySQL
  • 大規模なショッピングサイトのDB設計について

    はじめまして。 今回、以下のような規模のショッピングサイトを構築しようと思っています。 商品数が1万点を超えます。 商品の詳細ページ、分類ページはテンプレートを用意してユーザがアクセスする度に商品データベースにアクセスしてデータを読み込もうと思っています。 この際に生じた疑問点があります。 ・1万点を一つの商品テーブルで扱う場合に、アクセスしたときにどれくらい遅くなるのかという点。このような規模の場合、どんな設計にするべきなのか?気をつけるべきことがあるのか?教えて下さい。 ・顧客数や受注伝票が多数想定されるので、いくつかのテーブルにわけようと思っているのですが、どのような分け方が一般的なのでしょうか? 使用する言語がPHP、DBにはMySQLかPostgreSQLの場合について考えています。 宜しくお願い致します。

  • mysqlのデータベース設計(1テーブルで管理)

    お世話になります。 現在、会員がログインしてブログ管理できる(記事を作成・編集できるシステム)を考えています。 そこでデータベース設計について質問があります。 一般的には、 ・ユーザー情報に関するテーブル ・ブログ記事に関するテーブル この2つを以下のような感じで設計すると思うのですが↓ ■usersテーブル ・id ・ユーザー名 ・パスワード ■articleテーブル ・id ・user_id(記事投稿者のid) ・contents(ブログタイトル、ブログ本文) ・created ・modified 私は、この2つを1つのテーブルですべてまとめて管理することを考えているのですが、 何かデメリットはあるのでしょうか?↓ ■usersテーブル(このテーブル1つですべてまとめて管理) ・id ・ユーザー名 ・パスワード ・contents(ブログタイトル|ブログ本文|記事投稿日|記事編集日) ・created ・modified ちなみにブログ記事は、区切り文字で分けながらcontentsにどんどん詰め込んでいき(updateする)、 取り出すときは区切り文字をexplodeしていく形を考えています。 実際にはもっと項目が多くなるのですが、1ユーザーの情報をすべて1つのテーブルで管理することで個人的に非常にわかりやすい、さらに単純なのでこちらのほうが速度も速いのではないかと思っているのですが、良くないのでしょうか?(あまり見かけないので) どなたか教えていただけると幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP