我应该将“消息”分成两个表格吗?

时间:2019-02-24 08:14:32

标签: sql database-design chat

假设我们有一个聊天系统,用户可以在其中发送消息:

  • 到频道
  • 特定用户

我必须选择:

  1. 其中一个表具有channel_idrecipient_id作为外键。这样做的问题是,该表很可能会比第二点的表大得多,并且它将具有很多空值(因为所有私有消息都为channel_id空,所有通道消息都为{{ 1}}空)。

  2. 2个单独的表:一个用于私人消息,一个用于频道消息。这样可以避免膨胀1个具有空值的表,但最终要维护2个非常相似的表(因为它们必须具有几乎相同的属性)。

我不是数据库专家,并且很高兴获得有关这2点的一些见解。该选择哪一个?为什么?

2 个答案:

答案 0 :(得分:0)

如果您优先考虑性能,那么请选择第二个选项;如果您担心大小,请选择第一个。

或者,您可以采用另一种方法: 创建一个表作为历史表,并将“新记录”列的标志设置为false,并转储所有已发送到历史表的数据和主表中的新数据(尚待发送),并带有标志“ New Record” “ = true。 这样,您可以保持第一种方法。

答案 1 :(得分:0)

为每对进行交流的用户创建一个渠道。这样一来,发送给频道的消息和发送给用户的消息就不会有区别了。

我发现将对等渠道命名为

很方便

[prefix][lesser_user_id][separator][greater_user_id]

例如,用户56789和12345之间的频道可以命名为chan12345.56789。 在这种情况下,当您需要在两个用户之间找到合适的频道时,只需将其作为ID。