我有一个简单的消息系统,到目前为止使用基于文件的存储。由于系统用户数逐渐增加,我想切换到基于数据库的存储。
在代码中,消息服务器维护用户列表(带有凭据)和消息列表。 Message对象的主要字段为Sender(User类型),Recipients(类型为User [])和Content(类型为string)。
通常,用户将从服务器请求发送给他的消息,并接收“收件人”字段包含其自己的用户名的所有消息。
因此,对于数据库,我设想了以下表格:
- 用户表
-A消息表
( - 每个用户的表格,用于指定MessageID发给他的邮件)?
我遇到的问题是如何存储“收件人”字段(包含数组),以便数据库查询可以搜索请求接收发送给他的邮件的用户。我没有比为在系统上注册的每个新用户动态创建表更好的解决方案,该系统保存对作为收件人列出的消息的引用。其他方法可能吗?
非常感谢!
答案 0 :(得分:11)
我看不出更好的解决方案 为每个动态创建一个表 新用户......
从relational-databases的角度来看,你永远不应该看到“动态创建的表格”。
一般来说,您的问题解决如下:
users
表,其中包含(user_id,name,surname ...)messages
表(message_id,time_stamp,subject,body,sent_by ...)messages_recipients
表(message_id,recipient_id) sent_by
表格中的messages
字段和recipient_id
表格中的messages_recipients
字段都应该foreign keys到user_id
字段在users
表中。
答案 1 :(得分:3)
“每个用户的表”-idea很恐怖(抱歉)。
Prashant对设计是正确的,虽然我想补充一点改进:因为msg只有一个发件人,所以不需要单独的表来跟踪发件人,但你可以有一个字段消息表中的“发送者”。加上收件人表来映射msgs +收件人。
答案 2 :(得分:1)
用户表,消息表,消息发送方表 - 包含发送方用户标识和消息标识的映射。具有receipent用户标识和消息标识的接收方消息表。因此,多个receipents将映射到相同的消息ID,但表中将有多行。有意义吗?
答案 3 :(得分:0)
您正在描述多对多关系,因此您需要的是位于[用户](收件人)和[消息]表之间的联结表。
例如,一个表[UserMessages],它拥有自己的主键ID,以及另外两个代表用户PK和消息PK的列。
然后,查询,实体等可以通过加入这些表来将多个消息与多个用户相关联。