请教两个关于django中数据库设计的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
iiduce
V2EX    Python

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

  •  
  •   iiduce 2010-10-05 12:44:28 +08:00 6300 次点击
    这是一个创建于 5499 天前的主题,其中的信息可能已经有所发展或是发生改变。
    正在设计一个基于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是个字段多记录多的大表,而点击量统计量要频繁更新操作。

    偶基础太差,大家见笑。
    7 条回复    1970-01-01 08:00:00 +08:00
    darcy
        1
    darcy  
       2010-10-05 13:01:34 +08:00
    我的个人愚见

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

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

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

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

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

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

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

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

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

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

    受教了。 谢谢。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2628 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 14:45 PVG 22:45 LAX 07:45 JFK 10:45
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86