代码之家  ›  专栏  ›  技术社区  ›  Varun Hegde

数据库非规范化?[已关闭]

  •  -2
  • Varun Hegde  · 技术社区  · 9 年前

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

    因此,其中一个表是我的消息,它包含以下字段 id,chat_payload,message_time,user_id,room_id .

    为了填充初始聊天室,我需要检索消息历史记录,其中每个消息对象将包括 username,useravatar,chat_payload,timestamp .但是 useravatar,username 存储在 users, user_meta 表。因此,使用连接在运行时获取数据显然很昂贵,因为 user_meta fast 。并清楚地存储用户名、用户头像 messages 表似乎不正确,因为它会带来更新问题。

    因此,考虑到上述场景,是否有人可以建议一个合适的数据库/应用程序设计?

    1 回复  |  直到 9 年前
        1
  •  1
  •   James K. Lowden    9 年前

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

    好的数据是第一要务,对吧?你正在考虑为了你无法确定的性能承诺而妥协。

    有时人们不太理解正常形式的发明是为了防止所谓的 更新异常 .3NF将大大有助于保持数据的一致性。作为一个额外的好处,缺乏冗余是 有效率的 因为它最小化了必须更新的信息量。

    出于这些原因,在1000个其他原因中,最好的做法是设计一个规范化的数据库,就像教科书所说的那样,让芯片落在它们可能落的地方 设计 考虑到加入,你可以肯定。而且它有许多特性,尤其是索引,可以使它们更高效。要相信这一点,而不是根据你第一次对快速或缓慢的印象。

    如果确实遇到性能问题,数据库设计就不太可能 将会有问题。如果是这样的话,它会发生得很慢,你将有时间根据实际情况和真实事实进行检查和纠正。有了它总比现在没有好。