2010-02-22 52 views
3

只是尋找一些關於如何處理數據庫設計的建議。數據庫設計 - 爲用戶存儲積分的方法

在我的網站上,用戶可以獲得積分來執行不同的活動。目前我有3項活動可以獎勵積分 - 但設計必須具有可擴展性,可以添加其他獎勵積分活動。

所以今天 - 用戶得到點 1)當他增加了一個新的商店,他得到10分(存儲信息存儲在存儲表) 2)當他回答問題,他得到7分(問題/答案存儲在解答表) 3)當他指的是誰加入他得到5分

的網站,所以這是我迄今爲止的朋友 - 但它不看的權利:)

Points_Table point_id USER_ID action(這將捕獲點的給定動作) 分

我應該能夠從數據庫中推斷出該用戶獲得了xxxx積分來創建這個商店或轉介這些朋友或回答這個問題。 上面的設計顯然沒有考慮到這一點。

感謝您的提示

回答

2

根本不存儲點。只需對此視圖進行查詢即可。這樣一來,面對任意改變,它就會很健壯。

create view UserPoints 
as 
select 
    created_by_id as user_id, 
    'STORE' as action_type, 
    store_id as action_id, 
    (select points from action_points where action_desc='create store') as points 
from store 
union 
select 
    user_id, 
    'ANSWER' as action_type, 
    question_id as action_id, 
    (select points from action_points where action_desc='answer question') as points 
from answer 
union 
select 
    referred_by_id as user_id, 
    'REFERRAL' as action_type, 
    referred_id as action_id, 
    (select points from action_points where action_desc='referral') as points 
from referral 

編輯補充:

這遵循了正常的數據庫設計原則。所有數據庫規範化都可以歸結爲:不重複數據。

包含點表基本上只是重複其餘數據庫已包含的信息。因此,應該省略。考慮到維護數據一致性所必須達到的長度,這一點已經很清楚。不用擔心這些問題,如果推薦是歸功於Alice,但是後來確定Bob應該獲得這筆貸款,則需要更改單個表格中單個行中的單個字段。如果包含點表,那麼它也必須以某種方式更新。如果積分總結被存儲,那麼上帝可能會憐憫你的數據庫。

而不是存儲點,可以使用視圖或存儲過程來代替,然後當數據更改時自動調整點系統。

在這種情況下,我認爲視圖對於存儲過程是可以推出的,因爲有很多方法可能需要分析點數據,並且這提供了最大的靈活性,並且它爲優化器提供了最佳機會確定最佳路徑。

您可以從視圖中選擇user_id或action_type或總結點列以獲取用戶或所有用戶的總計。看看你可以擁有的樂趣,它幾乎免費!

select 
    sum(up.points) as total_points, 
    up.user_id, 
    u.user_name 
from 
    UserPoints up 
    join user u on up.user_id = u.user_id 
group by 
    user_id, 
    user_name 
order by 
    total_points desc 
+0

謝謝傑弗裏 - 我沒有想到這種方法 – Gublooo 2010-02-22 17:08:20

+0

@Jeffrey,非常有趣的方法確實。看到這是一個非常古老的線程。只是好奇,這種方法在一個系統中能夠很好地擴展,比如像SO一樣大?這個視圖可能非常複雜,數據集可能非常大。 – 2016-03-09 16:19:22

0

如果你希望能夠追蹤行動回到在商店或答案表中的一行,添加第四個欄,這對於行動加入該行的PK進入。

+0

您好安德魯 - 我不太明白你說的話 - 如果我想這點鏈接到創建或朋友提及實際店 - 再加入一列到這個表是不夠的 - 我需要向右添加3列 - store_id,refer_id和answer_id,它們是這些表的相應pk。 但這不會是一個好設計嗎? – Gublooo 2010-02-22 17:04:20

+0

您需要爲目標表的pk和另一列標識目標表添加一列。 – Kangkan 2010-02-22 17:32:41

+0

OFCOURSE - 我覺得我沒有想直 - 非常感謝 – Gublooo 2010-02-22 17:44:48

2

添加一個表,用於存儲用戶獲取點的操作(通用表列出指向不同表中實際操作的操作)。該表可能類似於Reward_Actions(ActionId,ActionType,Pointsspot)等,您可以通過此添加不同類型的獎勵活動。

+0

謝謝,很有意義 – Gublooo 2010-02-22 17:00:38

1

一個典型的設計就是讓用戶表,動作表和用戶行爲表記錄用戶完成的所有動作。你需要兩個外鍵,可能還有一個主鍵,以及他們完成時的日期標記。然後,您可以將每個動作的積分存儲在動作表中,並且每當您查找總積分時,只需加入表格並按時間戳排序,以便獲得積分的歷史記錄。

+0

謝謝ryan - 感謝您的幫助 – Gublooo 2010-02-22 17:01:39