V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xing393939
V2EX  ›  数据库

关于设计表结构的困惑

  •  
  •   xing393939 · 2013-07-21 18:21:37 +08:00 · 1355 次点击
    这是一个创建于 4146 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如一个私信的场景,二人之间的私信在表中会产生二条记录(方便查询)。
    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表了。

    有必要拆分表吗,我对一些数据库的一些设计概念不是很懂,只是感觉这样会更好些。。。。
    8 条回复    1970-01-01 08:00:00 +08:00
    lichao
        1
    lichao  
       2013-07-21 18:29:59 +08:00 via iPhone   ❤️ 1
    如果拆分能减少很多冗余数据,那就拆分
    hemingway
        2
    hemingway  
       2013-07-21 18:33:57 +08:00   ❤️ 1
    必须拆分,否则就是数据冗余了。
    因为forbid_status和is_payed这两个数据和其他数据没有关系。
    xing393939
        3
    xing393939  
    OP
       2013-07-21 18:56:56 +08:00
    @lichao
    @hemingway 谢谢,如果我想学关于数据库设计方面的规范和原则什么的,有啥好的文章或者书籍推荐啊
    hemingway
        4
    hemingway  
       2013-07-21 19:25:52 +08:00   ❤️ 1
    michaelbibby
        5
    michaelbibby  
       2013-07-21 20:14:00 +08:00   ❤️ 1
    多嘴一句,is_payed 应该改为 is_paid。
    hahastudio
        6
    hahastudio  
       2013-07-21 20:33:16 +08:00   ❤️ 1
    首先,原来的表里,我们可以知道
    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
        7
    xing393939  
    OP
       2013-07-22 09:28:18 +08:00
    @michaelbibby 英语不好。。
    @hahastudio 实际情况的确是一个用户只对某一用户付费而使其强制收到私信
    hahastudio
        8
    hahastudio  
       2013-07-22 11:30:10 +08:00   ❤️ 1
    @xing393939 那可以改成 UserToUserChatStatus(uid, chat_uid, forbid_status, paid_status)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1100 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 19:52 · PVG 03:52 · LAX 11:52 · JFK 14:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.