V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
supersheep
V2EX  ›  问与答

这样的需求应该怎样设计表?

  •  
  •   supersheep · 2011-03-27 14:09:54 +08:00 · 4279 次点击
    这是一个创建于 5001 天前的主题,其中的信息可能已经有所发展或是发生改变。
    存在 A,B,C 三个表

    我希望两两之间的关系都存在连接,他们都是多对多的关系。

    比如“A通过B做了C事” 可以分解成 “A通过B做了事”,“A做了C事”,“B成就了C事”

    这种情况下的表一般如何设计?

    拆分成三个表?
    14 条回复    1970-01-01 08:00:00 +08:00
    Livid
        1
    Livid  
    MOD
       2011-03-27 14:12:57 +08:00
    我的猜测,不知道对不对?

    A 是用户
    B 是行为或者条件
    C 是成就系统里的单项成就
    supersheep
        2
    supersheep  
    OP
       2011-03-27 14:17:39 +08:00
    怪我,说得太隐晦了。我想的是“用户对问题做出看法”,表达出来应该是“A对B作C观”。
    A是用户,B话题(其实也可以是其他任何形式),C是观点。
    这里A和C的关系不是特别重要,不过如果要做推荐算法的话就会有意义了。
    supersheep
        3
    supersheep  
    OP
       2011-03-27 14:20:06 +08:00
    @Livid 又忘记艾特= =
    chloerei
        4
    chloerei  
       2011-03-27 15:08:43 +08:00
    sql

    users( id, ... )
    problems( id, ... )
    users_problems( user_id, problem_id )
    viewpoints( id, ... )
    problems_viewpoints( user_id, problem_id, viewpoint_id, ... )

    MongoDB

    users:
    { _id : ..., ... }

    problems:
    {
    _id : ..., ... ,
    viewpoints : [
    { user_id : ..., viewpoint : ... },
    { user_id : ..., viewpoint : ... }
    ]
    }
    chloerei
        5
    chloerei  
       2011-03-27 15:10:04 +08:00
    …… 我想编辑
    Livid
        6
    Livid  
    MOD
       2011-03-27 15:11:00 +08:00
    @supersheep 你的这个问题会需要用到 3 张以上的表。
    chloerei
        7
    chloerei  
       2011-03-27 15:11:41 +08:00
    sql

    users( id, ... )
    problems( id, ... )
    viewpoints( id, user_id, problem_id, ... )

    4 楼黑历史了
    Livid
        8
    Livid  
    MOD
       2011-03-27 15:11:45 +08:00
    @chloerei 我建议可以贴 gist。

    https://gist.github.com/

    这样你就可以随时更新 gist。
    chloerei
        9
    chloerei  
       2011-03-27 15:13:23 +08:00
    @Livid 好的,吃教训了
    supersheep
        10
    supersheep  
    OP
       2011-03-27 15:26:18 +08:00
    @chloerei 不知道你写的users_problem是作何用,如果是用户创建的话题,可以把creator直接作为话题的字段。如果是参与话题,则problem_viewpoints里就可以拿到了。
    我之前就是除了user,topic,viewpoint之外,还需要类似你的problems_viewpoints这样一个表,还是将这个表中的三个字段两两结合拆成三个表这样子。
    btw,第一次看到MongoDB的写法,很诱人的样子啊。
    supersheep
        11
    supersheep  
    OP
       2011-03-27 15:29:52 +08:00
    刚和公司的DBA同学探讨了一下。我原本的期望是这个viewpoint可以单独拿出来,对于不同的问题可以运用同一个viewpoint,后来觉得这样太琐碎了,没特别大必要……
    还有一点就是提倡适度的冗余来防止表关连查询……
    chloerei
        12
    chloerei  
       2011-03-27 15:39:05 +08:00
    @supersheep 7楼为准,4楼在发出时候发现自己犯傻了,在看漫画脑子不清楚
    chloerei
        13
    chloerei  
       2011-03-27 15:40:35 +08:00
    @supersheep 感觉 viewpoint 冗余度不高吧,除了“沙发”“赞成”这样的观点。
    supersheep
        14
    supersheep  
    OP
       2011-03-27 15:45:57 +08:00
    @chloerei 嗯。在看这篇文章 http://icyleaf.com/2008/06/21/tags-database-schemas/ 感觉和我的需求有点像。对数据库还不是特别娴熟啊。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1044 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 19:31 · PVG 03:31 · LAX 11:31 · JFK 14:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.