【问题标题】:How to store arrays in a database?如何在数据库中存储数组?
【发布时间】:2010-01-23 20:33:14
【问题描述】:

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

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

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

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

非常感谢!

【问题讨论】:

  • “我认为没有比为每个新用户动态创建表更好的解决方案了” 不要这样做。了解如何标准化数据库。
  • 这个问题的答案可能对其他人有用。关于如何改写其标题以使其更容易找到的任何建议?

标签: .net sql database-design


【解决方案1】:

我认为没有比这样做更好的解决方案了 为每个动态创建一个表 新用户...

relational-databases 的角度来看,您永远不应该看到“动态创建的表”。


一般你的问题是这样解决的:

  • 带有(user_id、name、surname ...)的users
  • 带有(message_id、time_stamp、主题、正文、send_by ...)的messages
  • messages_recipients 表(message_id,receiver_id)

messages 表中的sent_by 字段和messages_recipients 表中的recipient_id 字段都应为foreign keysusers 表中的user_id 字段。

【讨论】:

  • 啊,是的,messages_recipients 表是缺失的链接。我将尝试实现它(大约 5 年后回到数据库编程)。谢谢!
  • 我发现这个答案对数据库新手非常有用。知道如何改写其标题以使其更容易找到吗?
  • @Dabblernl:可能类似于“在数据库中存储数组”? ... +1 努力帮助新手 :)
【解决方案2】:

“每个用户的桌子”- 想法是可怕的(对不起)。

Prashant 的设计是正确的,尽管我想添加一点改进:由于 msg 将只有一个发件人,因此不需要单独的表来跟踪发件人,但您可以有一个字段消息表中的“发件人”。加上收件人表来映射消息+收件人。

【讨论】:

  • 谢谢,问这个问题的真正原因是动态创建表格感觉不对。
【解决方案3】:

User 表、Messages 表、Message sender 表怎么样 - 包含 sender userid 和 message id 的映射。带有接收者用户 ID 和消息 ID 的接收者消息表。因此,多个接收者将映射到相同的消息 ID,但表中会有多行。有道理吗?

【讨论】:

    【解决方案4】:

    您正在描述多对多关系,因此您需要一个位于 [Users](收件人)和 [Messages] 表之间的联结表。

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

    然后,查询、实体等可以通过跨这些表连接将多条消息与多个用户相关联。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      相关资源
      最近更新 更多