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 · 5924 次点击
    这是一个创建于 5147 天前的主题,其中的信息可能已经有所发展或是发生改变。
    正在设计一个基于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
       2010-10-05 13:25:11 +08:00 via iPhone
    Less join more performance.
    iiduce
        3
    iiduce  
    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
       2010-10-05 13:39:56 +08:00 via iPhone
    用 iPhone 没法回长贴子。

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

    非整数类型,如果尺寸很大,那么放入 kv db。
    Livid
        6
    Livid  
    MOD
       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   ·   实用小工具   ·   1025 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 21:56 · PVG 05:56 · LAX 13:56 · JFK 16:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.