如何在数据库中存储数组?

时间:2010-01-23 11:21:53

标签: .net sql database-design

我有一个简单的消息系统,到目前为止使用基于文件的存储。由于系统用户数逐渐增加,我想切换到基于数据库的存储。

在代码中,消息服务器维护用户列表(带有凭据)和消息列表。 Message对象的主要字段为Sender(User类型),Recipients(类型为User [])和Content(类型为string)。
通常,用户将从服务器请求发送给他的消息,并接收“收件人”字段包含其自己的用户名的所有消息。

因此,对于数据库,我设想了以下表格:
- 用户表
-A消息表
( - 每个用户的表格,用于指定MessageID发给他的邮件)?

我遇到的问题是如何存储“收件人”字段(包含数组),以便数据库查询可以搜索请求接收发送给他的邮件的用户。我没有比为在系统上注册的每个新用户动态创建表更好的解决方案,该系统保存对作为收件人列出的消息的引用。其他方法可能吗?

非常感谢!

4 个答案:

答案 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 keysuser_id字段在users表中。

答案 1 :(得分:3)

“每个用户的表”-idea很恐怖(抱歉)。

Prashant对设计是正确的,虽然我想补充一点改进:因为msg只有一个发件人,所以不需要单独的表来跟踪发件人,但你可以有一个字段消息表中的“发送者”。加上收件人表来映射msgs +收件人。

答案 2 :(得分:1)

用户表,消息表,消息发送方表 - 包含发送方用户标识和消息标识的映射。具有receipent用户标识和消息标识的接收方消息表。因此,多个receipents将映射到相同的消息ID,但表中将有多行。有意义吗?

答案 3 :(得分:0)

您正在描述多对多关系,因此您需要的是位于[用户](收件人)和[消息]表之间的联结表。

例如,一个表[UserMessages],它拥有自己的主键ID,以及另外两个代表用户PK和消息PK的列。

然后,查询,实体等可以通过加入这些表来将多个消息与多个用户相关联。