-2

只是为了提供一些上下文,我正在使用 Pusher(云上的 Websocket 服务)开发一个实时聊天应用程序,其中每个消息都记录在我的服务器中,然后再推送到 websocket 服务器,然后将数据推送到客户端。所以我正在使用 MySQL 来存储消息。

所以一个这样的表是我的消息,它有以下字段id,chat_payload,message_time,user_id,room_id

为了填充初始聊天室,我需要检索消息历史记录,其中每个消息对象都将包含username,useravatar,chat_payload,timestamp.但它们分别useravatar,username存储在users, user_meta表中。因此使用连接获取运行中的数据显然看起来很昂贵,因为user_meta表增长非常。而且很明显在表中存储用户名、用户头像messages似乎不正确,因为它会带来更新问题。

因此,考虑到上述情况,任何人都可以建议一个合适的数据库/应用程序设计吗?

4

1 回答 1

1

将用户名、用户头像存储在消息表中...会造成更新问题

好的数据是工作#1,对吧?您正在考虑为了您无法确定的性能承诺而做出妥协。

有时人们低估了正常形式是专门为防止所谓的更新异常而发明的。3NF 将大大有助于保持数据的一致性。作为一个额外的好处,缺乏冗余是有效的,因为它最大限度地减少了必须更新的信息量。

出于这些原因,在其他 1000 种原因中,最好的做法是设计一个规范化的数据库,就像教科书上所说的那样,让筹码落在可能的地方。您可以肯定,您的 DBMS 在设计时就考虑到了连接。它具有许多使它们高效的功能,尤其是索引。依靠这一点,而不是您对快或慢的第一印象。

如果您确实遇到了性能问题,那么数据库设计本身不太可能出错。如果是的话,它会慢慢发生,你将有时间根据实际情况,用真实的事实来检查和纠正它。有了那个,比现在没有更好。

于 2016-07-15T06:05:16.473 回答