【问题标题】:Database schema for messaging to multiple users用于向多个用户发送消息的数据库模式
【发布时间】:2011-05-14 11:46:38
【问题描述】:

我正在寻找向系统内的多个用户发送消息的最佳解决方案(Facebook 风格)。

我想出了以下想法:每条消息都属于 Message_Chain 并且在 Message_status 表中列出了用户发送者和用户接收者。但是,当系统中有数百万条消息时,恐怕这种模式使用起来效率不高。

任何人都可以提出任何其他解决当前问题的方法吗?或者解释一下为什么我的解决方案会很好?

CREATE  TABLE `message` (
  `msg_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `msg_text` TEXT NOT NULL ,
  `msg_date` DATETIME NOT NULL ,
  PRIMARY KEY (`msg_id`) );

CREATE  TABLE `message_chain` (
  `msgc_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `msgc_topic` VARCHAR(255) NULL ,
  PRIMARY KEY (`msgc_id`) );

CREATE  TABLE `message_status` (
  `msgsta_msg_id` BIGINT UNSIGNED NOT NULL ,
  `msgsta_usr_id` INT UNSIGNED NOT NULL ,
  `msgsta_msgc_id` INT UNSIGNED NOT NULL ,
  `msgsta_is_sender` TINYINT(1)  NULL ,
  `msgsta_is_read` TINYINT(1)  NULL DEFAULT NULL ,
  `msgsta_is_deleted` TINYINT(1)  NULL ,
  PRIMARY KEY (`msgsta_msg_id`, `msgsta_usr_id`);

【问题讨论】:

  • “但是我担心当系统中有数百万条消息时,这个模式使用起来效率不高。”..我认为你应该先达到这个限制,然后再过分担心某些细节,过早的优化是万恶之源:)
  • 不同意 :) 成熟的计划 = 没有未来的头痛

标签: mysql database facebook schema messages


【解决方案1】:

只要没有太多相同消息的收件人,架构应该可以正常工作。我不明白你如何才能使它更小或更高效。

我能看到的唯一性能问题是,如果您想进行广播,即向一个大组或系统上的每个用户发送相同的消息。发送这样的消息会很慢(去过那里,做过)。在这种情况下,我会懒惰地跟踪此类全局消息的状态,即仅在单个用户打开消息后为其创建状态行。但如果你没有计划这样的功能,我会说暂时忽略这个问题。

【讨论】:

    【解决方案2】:

    我的解决方案是通过使用更多的编程来确定哪条消息发送给谁,从而避免大量数据存储。

    例如,如果您想向系统的所有用户发送消息,则在 usr_id 列中放置一个“”,然后您可以通过编程方式获取 usr_id = current_usr_id OR '的所有消息'。然后,您可以执行各种过滤器并提出自己的语法来创建没有数据库存储的 messager_user 列表。

    似乎是处理/存储之间的权衡......

    【讨论】:

    • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。您也可以add a bounty 引起更多关注这个问题。 - From Review
    • @EwaldHofman 的“问题”是:有人可以提出任何其他解决当前问题的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2018-01-15
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多