【发布时间】:2011-10-07 23:25:21
【问题描述】:
我正在重建一个流量很大的网站的后台系统。
这是应用程序的核心,我构建这部分数据库的方式对于大量代码和即将开展的工作至关重要。下面描述的系统每天必须运行数百万次。我将不胜感激有关此问题的任何意见。
背景是用户可以添加他或她白天吃的东西。
简化了,流程差不多是这样的:
- 用户到达该站点,该站点列出了他/她当天的选择(如果之前按以下步骤所述输入)。
- 用户可以添加一餐(由 1 到无限种不同的食物及其数量组成)。餐点是通过搜索字段添加的,并按不同的类型进行组织(如“早餐”、“午餐”)。
- 在制作膳食过程中,将显示最常用的食物列表(主要由该用户提供,其次是由所有用户提供)以供快速选择。
- 餐点将存储在 FoodLog 表中,该表由以下内容组成:
id, user_id, date, type, food_data。
我目前拥有的是一个巨大的数据库,其中包含将执行搜索的食品。食品项目与通用名称(如“猪排”)和生产商(如“可口可乐”)信息以及所需的其他详细信息一起存储。
问题总结:
我的问题是我不知道存储数据的最佳方式,以便以我需要的方式轻松访问它,并且数据库不会失控。
假设有 100 万用户每天添加 1 到 7 顿饭。为了存储每餐的每种食物,每天,每个用户每天可能会创建 (1*avg_num_meals*avg_num_food_items) 百万行。
以某种压缩方式存储数据(比如 food_data 是一个 json_encoded 字符串),会显着减少行数,但同时也难以创建“最常用的食品”列表和其他统计信息在飞行中。
应该把表拆分成几张表吗?如果是这样,他们将如何互动?
该网站目前托管在中档 CDN 上,并使用 LAMP(Linux、Apache、MySQL、PHP)主干。
【问题讨论】:
-
您遇到了经典数据库设计者的困境:规范化还是不规范化。
-
你不是说VPS而不是CDN。可以安装软件吗?如果可以的话,我建议您使用 Redis 或 memcached 研究缓存(使读取速度极快)。另外,我建议您查看 APC 以获取 PHP 脚本的编译字节码。
标签: php mysql database performance database-design