產品資料庫設計時,經常遇到5星評價的情況,資料表如何設計才能即保證查詢效率,又能減少資料冗餘呢?
初步設計思路如下,請大家指正程式設計客棧。
一,最終效果,
二,表結構
複製** **如下:
create table if not exists `books` (
`id` int(8) not null auto_increment,
`title` varchar(50) not null,
`vote_1` int(8) unsigned not null,
`vote_2` int(8) unsigned not null,
`vote_3` int(8) unsigned not null,
`vote_4` int(8) unsigned not null,
`vote_5` int(8) unsigned not null,
`**grate` int(8) unsigned not null,
`amountofvotes` int(8) unsigned not null,
primary key (`id`)
) auto_increment=1 ;
create table if not exists `users` (
`id` int(8) not null auto_increment,
`username` varchar(20) not null,
primary key (`id`)
) auto_increment=1 ;
create table if not exists `votes` (
`uid` int(8) unsigned not null,
`bid` int(8) unsigned not null,
`vote` int(1) not null,
primary key (`bid`, `uid`)
) ;三,設計思路資料表分為兩個部分,
1,第乙個部分,表v其中uid和bid設為了主鍵,這樣防止乙個使用者多次投票的情況;
查詢時,可以使用,
複製** **如下:
平均tkxlv分:select **g(vote) from votes where bid = $bid;
評價總數: select count(uid) from votes where bid = $bid;
如果有時間排序的需求,可以再增加乙個時間戳字段。
2,第二部分,冗餘部分
vote_1到vote_5,僅記錄每乙個級別評分的數量,有評分了則+1;
**grate記錄平均分;
amountofvotes記錄總分;
其中**grate和amountofvotes通過計算vote_1到vote_5得到,這樣減少了對錶votes的大量查詢。
如果配合評論,那麼評論中增加關聯即可,
複製** **如下:
create table if not exists `comments` (
程式設計客棧; `id` int(11) unsigned not null auto_increment,
`rating_id` int(11) unsigned not null default 0,
&nbs primary key ( `id` )
) 四,繼續優化需要思考的問題votes表中的資料量會是book中資料量的n倍,這種設計也便於votes的分表,不影響快速查詢。
本文標題: 擁有5星評級資料庫表結構 如何才能更高效的使用?
本文位址:
幾千萬記錄,資料庫表結構如何平滑變更?
繼續回答知識星球水友提問。問題域 資料量大 併發量高場景,如何在流量低峰期,平滑實施表結構變更?畫外音,一般來說,是指增加表的屬性,因為 如果是減column,公升級程式不使用即可 如果是修改column,程式相容性容易出問題 首先,一起看下有哪些常見方案。畫外音 alter table add c...
如何匯出db2資料庫的表結構和資料
對於db2資料庫,匯入和匯出表結構和資料其實很簡單,只需要用到db2look和db2move兩個命令即可。這兩個命令都需要在客戶端的命令列處理器 中執行,但對於資料庫伺服器和客戶端不在同一機器上的,需要借助catalog命令,來先完成遠端資料庫載入到本地,然後再進行匯出匯入操作。1 catalog ...
mysql如何比對兩個資料庫表結構的方法
在開發及除錯的過程中,需要比對新舊 的差異,我們可以使用git svn等版本控制工具進行比對。而不同版本的資料庫表結構也存在差異,我們同樣需要比對差異及獲取更新結構的sql語句。例如同一套 在開發環境正常,在測試環境出現問題,這時除了檢查伺服器設定,還需要比對開發環境與測試環境的資料庫表結構是否存在...