Php Facebook类消息的数据库设计

Php Facebook类消息的数据库设计,php,sql,mysql,database,database-design,Php,Sql,Mysql,Database,Database Design,我目前正在计划用PHP/MySQL开发一个新系统,希望确保我的数据库能够处理我计划存储的数据量。我的新项目的一个特点是像Facebook这样的“消息”功能。我想确保为最终用户创造尽可能好的体验。该网站最终将处理1000多个用户的信息,这些用户的信息总量可能达到数百万条。数据库设计的最佳方法是什么?MySQL是使用的正确数据库吗?如果您计划处理大量数据(当然,数百万甚至不符合大型数据库的要求),请雇佣一名datbase专业人员。针对大型数据集的高效数据库设计是一个复杂的问题,需要专家 在回答您的问

我目前正在计划用PHP/MySQL开发一个新系统,希望确保我的数据库能够处理我计划存储的数据量。我的新项目的一个特点是像Facebook这样的“消息”功能。我想确保为最终用户创造尽可能好的体验。该网站最终将处理1000多个用户的信息,这些用户的信息总量可能达到数百万条。数据库设计的最佳方法是什么?MySQL是使用的正确数据库吗?

如果您计划处理大量数据(当然,数百万甚至不符合大型数据库的要求),请雇佣一名datbase专业人员。针对大型数据集的高效数据库设计是一个复杂的问题,需要专家


在回答您的问题时,是的,如果设计好,mysql可以轻松处理数百万条记录;如果设计不好,mysql将是一场噩梦,这与任何其他现代数据库非常相似。

只要您将表设置为关系型,并设置表之间的关系,mysql就可以了


我还可以推荐Postgres吗?

Facebook从MySQL开始,只有当他们拥有超过1亿用户的7TB收件箱数据时,他们才开始使用MySQL


来源:。

如果你有预算,从MySQL开始,使用Zend::DB或更高级别的系统


更重要的是,在一开始就可以轻松地切换DMB,然后选择DBMS。

MySQL对数百万或数亿条记录没有问题,只要您正确地设计数据库

话虽如此,“像Facebook这样的消息功能”是一个相当宽泛的定义。通常,您会定义一个
messages
表,将每条消息链接到创建它的用户(即,在messages表中有一个
userId
列)。如果希望将邮件发送给多个用户,则有一个
message\u recipients
表,通过存储由
messageId
recipientId
组成的多条记录来定义一对多关系。将适当的索引添加到这些表中,您就完成了80%的工作


也就是说,剩下的20%可能是个杀手。不幸的是,您如何使用数据库将决定您还需要做什么,在做出这些判断之前,您必须提供有关应用程序的更多详细信息。例如,您可能希望考虑拥有自动归档解决方案,该解决方案使主表保持相对较小,并将旧数据移动到可以在必要时访问的备份表。你可能不会马上就需要它,但它在将来可能会有所帮助。

你不太清楚你想学什么。可以我会尽力给你一些建议

  • 规范化
  • 索引
  • MyISAM用于高负载下的表
  • 反规范化(原文如此!),但你应该明白你在做什么
  • 碎片
  • 简约的DB层带来灵活性

  • Sharding当然不需要你的“广泛”的需求…我已经处理了相当数量的数据,甚至没有考虑分区表和碎片实现,直到有许多表容纳超过十亿个记录(然后加入那些可能会有点慢)。用智能密钥来索引表,甚至可以考虑使用EAV类型结构来保持表的窄化,并减轻查询本身的空返回。

    上面的内容是在半睡半醒时写的,所以请忽略拼写错误;)

    如果您的意思是“对于消息系统,我的mysql表应该是什么样子的”,我将在消息系统中使用以下列:

    message_id
    fromuser
    fromview
    fromstatus
    touser
    toview
    tostatus
    title
    text
    poston
    thread
    
    显然,消息id是自动递增的。Fromuser和touser是显而易见的。Fromstatus和tostatus处于活动状态、已删除状态、清除状态、草稿状态,等等。Fromview和toview设置为“是”和“否”。标题、文本和“poston”日期都很明显。根据html表单和消息显示脚本的不同,线程可能会花费一些精力

    对于表单,基于“收件人:”字段创建foreach循环,并为每个收件人保存一份副本


    我希望这个信息系统能容纳数百万人,但那数百万人可能还要几年的时间。我保持它的小型化和简单化。

    如果数据库设计正确,性能会随着数据量的增加而下降。换句话说,执行查询的时间将比数据量增长慢得多

    为了实现这一目标,你必须在很多事情上遵守纪律:

    • 您的数据库设计必须合理。理解和正常化至关重要。理解数据结构和其他物理数据结构也是如此
    • <> LI>当你有一个很好的标准化数据库后,考虑是否有一些“边缘”应该出于性能原因而被明智地去归一化。
    • 在整个过程中,请记住客户端应用程序1将执行何种查询:
      • 相应地设计索引-专门为您知道需要的查询编制索引,不要过度编制索引
      • 一些设计决策,例如使用自然键与代理键以及识别与非识别关系可能会影响所需的连接数量
      • 尽量使数据库设计对集群范围扫描等保持友好
    • 使用特定于DBMS的机制,如分区、密钥压缩、物化视图(等等)等。如果DBMS不支持您认为必要的机制,请不要害怕切换DBMS!例如,在查询PK时,这是一个优势,但如果需要二级索引,则可能是一个劣势。如果同时需要集群表和基于堆的表,请使用同时支持这两种表的DBMS(如Oracle或MS SQL Server)。2
    • 仔细编写客户端应用程序代码。虔诚地使用绑定参数和查询-不仅可以最小化SQL解析