2010-02-22 55 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