2012-04-05 9 views
1

私は本当に趣味の人です。願望があまりにも大きすぎると言われました。データベースの変更がクライアントのリファクタリングを必要とせず、高速で済むようにデータベースを作成する正しい方法を見つけ出そうとしています。私が典型的な開発やDBAの用語をよく理解していないかのように答えてください。MySQLデータベースデザイン特有のケース、列または追加のテーブル?

状況:各ユーザーが評価した書籍の数を確認しようとしていました。

-Overall rating (ratings table) 
-sub rating (ratings table) 
-tag (book_tags table) 
-list (book_lists table) 

*Related tables: users, tags, lists 

問題:私は10件のサブ評価し、すべての評価表に2つの全体的な評価を持って、列の各(推測私はそれが次の任意の二つを持っている場合、定格本を考えますこれは悪いですが、わかりません)。代わりに、レーティングテーブル(12行)とbook_ratingsテーブル(レーティングテーブルの各行がユーザーのレーティングタイプ)を持っているべきですか?

-e.g. book_ratings: id | user_id | book_id | rating_id 

はいた場合、そのbook_ratingsテーブル上の500K書籍、ブックあたり12格付けの種類、10,000人のユーザーと50億行の合計が存在する場合、何が起こりますか?それは超低速で走るつもりですか?もう一つ考慮すべき点は、将来的にはより多くのサブ評価タイプを追加したいということですが、それは部分的に変更する価値があると思われる理由ですが、それは大変な作業です。

ありがとうございます!

答えて

1

システムをモデル化して、使用可能で拡張可能にする必要があります。 12の評価欄があると、結果などを集計したいときに苦痛を伴うことになります。このサイトには、こうした種類の痛みの例がたくさんあります。

それはあなたがインデックス、クラスタリング、データ・パーティショニングを追加することによって、最適化し成長するにつれ、など

しかし、あなたはすぐに大量のデータを持ってしようとしている知っていれば、あなたはいくつかの「ビッグデータ」のソリューションを検討する必要がありますNoSQLの道を行くかもしれません。

+0

私は最適化に関するいくつかの情報を教えていただけますか?何か適切な基礎ですか?先日、私は様々なクエリで使用するすべてのフィールドにインデックスを追加するまでは本当に減速していましたが、それでも暗闇の中をさまよう盲人のように行われました。理想的には、長期的には、うまくいけばデータベースの一部として200,000人のユーザーと100万の書籍を持っていたいと思う(Pipe dream、but hey :)。可能であれば、事前に計画を立てる方法を知りたい。 –

+1

これを最適化することは、少し黒い芸術です。私はMySQLに精通していませんが、SQL Serverではクエリの「実行計画」を表示できます。つまり、クエリを実行するためにサーバーが行っていることの詳細です.SQL Serverの場合は、最適化に非常に役立ちますどのインデックスを追加すべきかを直接指示することさえできます。私はMySQLに似たものがあると思います。 – MiMo

1

はい、私は説明したように構造を変更します - より柔軟で正しい(正規化)です。

各ユーザーがすべての書籍にすべての評価を与えた場合に限り、50億行(実際には悪いことになります)と思われます。大部分のユーザーは何も評価しません。多くの書籍は評価を引き付けません。

関連する問題