【问题标题】:Database Denormalization? [closed]数据库非规范化? [关闭]
【发布时间】:2016-11-18 00:42:29
【问题描述】:

只是为了提供一些上下文,我正在使用 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 表增长得非常快fast,加入显然看起来很昂贵。并且显然将用户名,useravatar 存储在messages 表中似乎不正确,因为它会带来更新问题。

那么考虑到上述情况,任何人都可以为同样的情况提出适当的数据库/应用程序设计吗?

【问题讨论】:

  • 说实话,朋友…… “MySQL 的力量会让你震惊。”正确的做法,恕我直言,“只存储 ID”,正如标准格式指南所建议的那样。
  • Varun 这个问题很差,你应该知道吧?
  • 这太模糊太笼统了。请使用 DDL 来描述一个模式,包括候选键和外键以及与优化相关的使用和架构的最重要方面。就像现在一样,您的问题本质上是要求介绍数据库优化。请将其范围缩小到一些特定的设计权衡。

标签: mysql database-design livechat application-design denormalized


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-07
    • 1970-01-01
    • 2014-12-23
    • 2013-01-18
    • 2012-12-31
    • 2013-01-28
    • 2016-07-23
    • 2010-09-17
    • 1970-01-01
    相关资源
    最近更新 更多