请教两个关于django中数据库设计的问题

2010-10-05 12:44:28 +08:00
 iiduce
正在设计一个基于django的社区程序,有两个关于数据库设计的问题想请教大家:

假设有这样几张表:
user(用户表), topic(主题表),reply(评论表)

user表中的几个字段:id,username及其它若干字段
topic表中的几个字段:id, title, user_id(外键),user_name,hit_num(点击量),reply_num(评论量)

假设这两张表都是百万级大表,使用mysql数据库,从执行效率上考虑下面两个问题:

问题一:
topic表中是否有必要有user_name字段。如果没有user_name字段的话,则每次读取topic列表或单记录信息时,需要表关联读取user表中的username字段。如果topic表中有user_name字段,则在每次添加topic记录时,同时写入创建者的user_name,读取时就不必关联user表了。

问题二:
topic表中是否有必要有reply_num字段。如果没有reply字段,则获取某主题回复总数时要使用count()方法在reply表中计算。如果有reply字段,则每次回复需要更新reply字段+1,需要主题回复数时,可以不再计算直接读取

问题三:
hit_num和reply_num字段是否应当设计在topic表中,还是应当再设计一个用户行为统计表,与user表关联,记录统计信息。这里主要考虑到topic是个字段多记录多的大表,而点击量统计量要频繁更新操作。

偶基础太差,大家见笑。
5775 次点击
所在节点    Python
7 条回复
darcy
2010-10-05 13:01:34 +08:00
我的个人愚见

#1 是否有必要有user_name在于user_name更改的频率与同步它到topic字段的代价,以及topic被查询的次数的代价想权衡

#2 建议有,但是一定时间做一次数据订正

#3 取决于重复查询的成本大,还是修改topic字段的成本大
Livid
2010-10-05 13:25:11 +08:00
Less join more performance.
iiduce
2010-10-05 13:26:10 +08:00
@darcy
谢谢,给了我一些启发。

#1 之前我确实没考虑到user_name同步的问题。不过用户名字段可以考虑不允许更改,或一定时间内只允许更改一次(如豆瓣)。

#2 有启发。按照你的说法,可以这样做。每次回复时,不更新topic的reply字段。每隔一定时间使用count()方法将topic表数据更新至topic方法。(这个可以和缓存一起做)

#3 我就是不确定联表查询的成本大,还是每次修改topic表字段的成本大。

另外,是不是可以考虑当用户发表主题或回复时,能改忍耐稍久的时间。而在显示读取时,用户的耐性更差些。
iiduce
2010-10-05 13:29:39 +08:00
@Livid
老大回复好简洁。

老大的意思是以提前做数据更新及数据冗余为代价,减少表连接的查询吧。
Livid
2010-10-05 13:39:56 +08:00
用 iPhone 没法回长贴子。

尽可能不要做跨表查询。如果一定要做,那么保证连接的 fields 及返回的所有 fields 甚至表里的所有 fields 都是整数。

非整数类型,如果尺寸很大,那么放入 kv db。
Livid
2010-10-05 13:41:25 +08:00
这些改进可以在上线 6 个月之后再做,先保证上线吧。
iiduce
2010-10-05 19:26:47 +08:00
@Livid

受教了。 谢谢。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/3115

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX