假设我们有一个聊天系统,用户可以在其中发送消息:
我必须选择:
其中一个表具有channel_id
和recipient_id
作为外键。这样做的问题是,该表很可能会比第二点的表大得多,并且它将具有很多空值(因为所有私有消息都为channel_id
空,所有通道消息都为{{ 1}}空)。
2个单独的表:一个用于私人消息,一个用于频道消息。这样可以避免膨胀1个具有空值的表,但最终要维护2个非常相似的表(因为它们必须具有几乎相同的属性)。
我不是数据库专家,并且很高兴获得有关这2点的一些见解。该选择哪一个?为什么?
答案 0 :(得分:0)
如果您优先考虑性能,那么请选择第二个选项;如果您担心大小,请选择第一个。
或者,您可以采用另一种方法: 创建一个表作为历史表,并将“新记录”列的标志设置为false,并转储所有已发送到历史表的数据和主表中的新数据(尚待发送),并带有标志“ New Record” “ = true。 这样,您可以保持第一种方法。
答案 1 :(得分:0)
为每对进行交流的用户创建一个渠道。这样一来,发送给频道的消息和发送给用户的消息就不会有区别了。
我发现将对等渠道命名为
很方便 [prefix][lesser_user_id][separator][greater_user_id]
例如,用户56789和12345之间的频道可以命名为chan12345.56789
。
在这种情况下,当您需要在两个用户之间找到合适的频道时,只需将其作为ID。