关于设计表结构的困惑

2013-07-21 18:21:37 +08:00
 xing393939
比如一个私信的场景,二人之间的私信在表中会产生二条记录(方便查询)。
uid,chat_uid,forbid_status,is_payed,content
101 303 1 0 hello
303 101 0 0 hello
forbid_status表示被阻止私信联系,上面可以看出101用户不能发私信给303用户。
is_payed表示是否付费过,如果is_payed=1,那么即使forbid_status=1,101用户仍然可以发私信给303。

现在我是用的一张表实现的这些,现在想着用三张表实现是否更好:
chat表
uid,chat_uid,content
forbid表
uid,chat_uid,forbid_status
payed表
uid,chat_uid,is_payed

因为chat表的记录远多于forbid表和payed表,这样可以节约存储空间。另外在判断二人能否私信的时候,也不必去查chat表了。

有必要拆分表吗,我对一些数据库的一些设计概念不是很懂,只是感觉这样会更好些。。。。
1221 次点击
所在节点    数据库
8 条回复
lichao
2013-07-21 18:29:59 +08:00
如果拆分能减少很多冗余数据,那就拆分
hemingway
2013-07-21 18:33:57 +08:00
必须拆分,否则就是数据冗余了。
因为forbid_status和is_payed这两个数据和其他数据没有关系。
xing393939
2013-07-21 18:56:56 +08:00
@lichao
@hemingway 谢谢,如果我想学关于数据库设计方面的规范和原则什么的,有啥好的文章或者书籍推荐啊
hemingway
2013-07-21 19:25:52 +08:00
michaelbibby
2013-07-21 20:14:00 +08:00
多嘴一句,is_payed 应该改为 is_paid。
hahastudio
2013-07-21 20:33:16 +08:00
首先,原来的表里,我们可以知道
uid, chat_uid → forbid_status
uid → is_paid #我猜的,也许实际情况是一可以用户只对某一用户付费而使其强制收到私信?
那么这么拆分比较好
UserToUserForbid(uid, chat_uid, forbid_status)
UserPaid(uid, is_paid)
UserToUserChatContents(uid, chat_uid, timestamp, content) #在这里加入时间戳我觉得是符合应用场景的

关于数据库的范式,BCNF,3NF,4NF用的比较多,可以看一看
xing393939
2013-07-22 09:28:18 +08:00
@michaelbibby 英语不好。。
@hahastudio 实际情况的确是一个用户只对某一用户付费而使其强制收到私信
hahastudio
2013-07-22 11:30:10 +08:00
@xing393939 那可以改成 UserToUserChatStatus(uid, chat_uid, forbid_status, paid_status)

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

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

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

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

© 2021 V2EX