2016-10-24 17 views
1

私は5つ星評価しています。うまくいきました。今私はデータベースを最適化したい。mysqlを使用したPHPの星評価

CREATE TABLE IF NOT EXISTS `rating` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `article_id` int(11) NOT NULL, 
    `vote` float NOT NULL, 
    'user_id' int(11) NOT NULL 

    PRIMARY KEY (`id`) 
) 

これは現在のデータベースです。今10,000人のユーザーが同じ記事を評価した場合、私は1つのテーブルに10000レコードを持っています。

誰でも私がデータベースの理解と最適化に役立つことができますか?

+2

「10000」レコードは少量とみなされます。最適化は、アプリケーションで実行する操作の性質とよく使用されるクエリによって異なります。それらの詳細を最初に提供する必要があります。 –

+0

各星の列。 1 *、2 *など。人々がそれを評価するたびに番号を追加するだけです。 – Irvin

+0

@AbhikChakrabortyもし私が100個の宝石を手に入れたら、100 * 10 lakhは大きくなります。 –

答えて

1

これはあなたの評価アルゴリズムと要件であるかどうかによって異なります。

star1 integer not null default 0, 
star2 integer not null default 0, 
... 
star5 integer not null default 0, 

しかし、あなたがしなければ、ユーザーの一部に"cooling off" ratingsの可能性と変化する考えを失う:あなたは星の数ではなく、1の5つのフィールドを使用して、受信し記録することができます。あなたは

stars integer not null default 0, 
voters integer not null default 0, 

を保存できるので、一方、this accepted answer algorithmは、唯一の平均値を保存するために

が必要です...しかし、今、ユーザー彼の投票を撤回することはできませんし、実際にはさらに彼かどうかを知りません投票したかどうかはです。

(1日の投票を1つのテーブルに保存し、datetimeとvoter IDなどを使って妥協することができます)、平均的なテーブルで古い結果を「蒸留」することで、投票者は彼が先週)。

あなたがする必要があるのは、があなたの要件を明確に示していることです。 - ユーザーは何ができますか?システムは何ができるのでしょうか? どの情報を知っておく必要があるか;そこからテーブル構造を派生させます。データが多すぎると(10,000,000レコードがそれほど多くない場合)、ハードウェアを増やしてみるか、何らかの方法で拡大縮小できるかどうかを確認してください。たとえば、記事間の情報が必要でない(たとえば、最も有名な記事 ")、記事IDに基づいて異なるサーバ間で格付けテーブルを分割するのを止めるものはありません。

関連する問題