2016-10-24 19 views
1

我正在使用5星評級,它工作正常。現在我想優化數據庫。在mysql中使用mysql進行星級評分

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位用戶對同一篇文章進行評分,則我在單個表中獲得了10000條記錄。

任何人都可以幫助我理解和優化數據庫嗎?

+2

'10000'記錄被視爲少量,現在優化取決於您在應用程序上執行的操作的性質以及經常使用的查詢。你需要首先提供這些細節。 –

+0

每個星的一列。 1 *,2 *等。每次人們評價時只需添加該數字即可。 – Irvin

+0

@AbhikChakraborty它可以我們10萬以及一篇文章,如果我有100個文章,然後100 * 10萬將是大 –

回答

1

這取決於您的評級算法和要求。你可以只是記錄使用五個領域,而不是一個接收數星星:

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

,但如果你這樣做,你失去的"cooling off" ratings用戶的一部分的可能性,轉變觀念。

在另一方面,this accepted answer algorithm只需要存儲的平均值,這樣你就可以存儲

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

...但現在用戶不能收回他的票,實際上甚至不知道是否他已投票或不投票。 (你可以通過將每日或每週的選票存入一張桌子,用日期時間和選民ID等等,然後在平均桌子上「提煉」舊的結果來妥協。現在選民可以看到並撤銷他在上個星期)。

所以你需要做的是明確說明你的要求 - 用戶可以做什麼?該系統必須能夠做什麼?等等 - 然後制定出什麼信息需要知道;那麼你從那裏派生出表格的結構。如果數據太多(10,000,000條記錄不多),您可以嘗試投擲更多硬件,或者查看您是否可以以某種方式進行縮放 - 例如,如果您不(通常)需要跨文章信息(例如「最有星標的文章「),沒有什麼能阻止你根據文章ID在不同的服務器上對分級表進行分區,直到每個分區足夠小以滿足您的口味。