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

2011-03-27 14:09:54 +08:00
 supersheep
存在 A,B,C 三个表

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

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

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

拆分成三个表?
4192 次点击
所在节点    问与答
14 条回复
Livid
2011-03-27 14:12:57 +08:00
我的猜测,不知道对不对?

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

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

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

https://gist.github.com/

这样你就可以随时更新 gist。
chloerei
2011-03-27 15:13:23 +08:00
@Livid 好的,吃教训了
supersheep
2011-03-27 15:26:18 +08:00
@chloerei 不知道你写的users_problem是作何用,如果是用户创建的话题,可以把creator直接作为话题的字段。如果是参与话题,则problem_viewpoints里就可以拿到了。
我之前就是除了user,topic,viewpoint之外,还需要类似你的problems_viewpoints这样一个表,还是将这个表中的三个字段两两结合拆成三个表这样子。
btw,第一次看到MongoDB的写法,很诱人的样子啊。
supersheep
2011-03-27 15:29:52 +08:00
刚和公司的DBA同学探讨了一下。我原本的期望是这个viewpoint可以单独拿出来,对于不同的问题可以运用同一个viewpoint,后来觉得这样太琐碎了,没特别大必要……
还有一点就是提倡适度的冗余来防止表关连查询……
chloerei
2011-03-27 15:39:05 +08:00
@supersheep 7楼为准,4楼在发出时候发现自己犯傻了,在看漫画脑子不清楚
chloerei
2011-03-27 15:40:35 +08:00
@supersheep 感觉 viewpoint 冗余度不高吧,除了“沙发”“赞成”这样的观点。
supersheep
2011-03-27 15:45:57 +08:00
@chloerei 嗯。在看这篇文章 http://icyleaf.com/2008/06/21/tags-database-schemas/ 感觉和我的需求有点像。对数据库还不是特别娴熟啊。

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

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

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

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

© 2021 V2EX