none
【SQL】数据库表的设计问题 RRS feed

  • 问题

  • 有一张表为tb_user 用来存放用户的基本信息,另一张表为tb_mail 用来存放为用户发送的邮件。

    tb_user的字段是这样设计的

    userid --用户名(int) 主键
    name --姓名(nvarchar)
    sex --性别(nchar)
    age --年龄(int)
     isnewmail --是否有新的消息(nchar) 值为'true'或'false'

    tb_mail的字段设计如下:

     userid -- 用户名(nvarchar) 不是主键,可以重复
    title --消息标题(nvarchar)
    content --消息内容(ntext)
    time --消息发布时间(datetime)
    问题来了,如果对单个会员发送消息,数据存放到tb_mail 表中,现在我增加了一个功能就是为全部会员发送同样的消息我有几个解决思路分析如下:
    一、为tb_user表增加一个字段为content 这个字段是存放每个会员相同的信息的。如果为全部会员发送同样的消息的话,这个字段里的值都是一样的。但我觉得这种设计不太合理

    二、把消息添加到tb_mail中,也就是说,如果为全部会员发送同样消息的话,在tb_mail表中会把每个会员的id插入到对应字段,content里面的值都是相同的消息,只不过userid不同,但仔细想想这种方法和第一种方法其实类似,只不过消息集中管理,都放到了tb_mail中,而第一种方法中tb_user表的content中存放的是相同消息,tb_mail表中存放的是为单个会员发送的消息。可以说两者形式是类似的。

    三、多建一个表tb_samemail字段设计如下:

    title --消息标题(nvarchar)
    content --消息内容(ntext)
    time --消息发布时间(datetime)

    如果发送同样消息的话,仅仅在该表中存放一条数据既可。然后会员都可以在这个表里检索数据。但这样多增加了一张表。 小弟想问问各位高手,这里的数据库如何设计比较合理,请给小弟提供一个方案。在下不胜感激。
    • 已移动 Sheng Jiang 蒋晟 2009年12月16日 19:20 SQL Server (发件人:ASP.NET 与 AJAX)
    2009年12月16日 5:46

答案

  • tb_user

    userid --用户名(int) 主键
    name --姓名(nvarchar)
    sex --性别(nchar) 
    birthday --出生日期(DateTime)
    newmailCount -- 新的消息数量 (int)  大于0即为有新消息
    mailCount 共有消息数量(int) 

    tb_mail
    mailid (int) 主键
    userid -- 用户名(nvarchar)  外键
    title --消息标题(nvarchar)
    contentid --消息id(int) 外键
    time --消息发布时间(datetime)

    tb_maildetail
    contentid --消息id(int) 主键
    content --消息内容(ntext)

    大多数查询只需要知道tb_mail的标题即可,用户点击了标题再到tb_maildetail查具体的content
    • 已标记为答案 KeFang Chen 2009年12月21日 8:17
    2009年12月16日 12:04