我该如何为这个问题设计数据库结构?

Mat*_*tis 4 php mysql database performance database-design

我正在重建拥有大量流量的网站的后台系统.

这是应用程序的核心,我构建数据库的这一部分的方式对于大量代码和即将开展的工作至关重要.下面描述的系统每天必须运行数百万次.我将不胜感激任何关于这个问题的意见.

背景是用户可以添加他或她白天吃的东西.

简化,这个过程或多或少是这样的:

  1. 用户到达站点并且站点列出他/她当天的选择(如果按照以下步骤描述之前输入).
  2. 用户可以添加一餐(由1个到无限量的食物及其数量组成).膳食通过搜索字段添加,并以不同类型组织(如"早餐","午餐").
  3. 在膳食构建过程中,将显示最常用食物项目的列表(主要由该用户,但其次也由所有用户),以便快速选择.
  4. 膳食将存储在FoodLog表中,该表由以下内容组成:id, user_id, date, type, food_data.

我目前拥有的是一个巨大的数据库,里面有食物项目,可以从中搜索.食品存储有关于通用名称(如"猪肉片")和生产者(如"可口可乐")的信息,以及所需的其他详细信息.

问题摘要:

我的问题是,我不知道存储数据的最佳方式,以便以我需要的方式轻松访问,并且数据库不会失控.

考虑每天增加1至7餐的100万用户.为了存储每餐的每个食品,每天和每个用户可能每天创建(1*avg_num_meals*avg_num_food_items)百万行.

以某种压缩方式存储数据(如food_data是一个json_encoded字符串),会显着减少行数,但同时也很难创建"最常用的食物项目"列表和其他动态统计信息.

该表应该分成几个表吗?如果是这种情况,他们将如何互动?

该网站目前托管在中端CDN上,并使用LAMP(Linux,Apache,MySQL,PHP)骨干网.

Pau*_*ier 10

粗略地说,您需要一个完全规范化的数据结构.您希望为用户提供一个表,为餐提供一个表(每餐一个条目,参考用户;您可能还希望在此表中有一个用餐的时间/日期),以及一个MealItems表,只是Meal和Food Items表之间的关联表.

因此,当用户进入并创建帐户时,您在"用户"表中创建一个条目.当用户报告他们吃过的膳食时,您可以在膳食表中创建记录,并在MealItems表中为他们报告的每个项目创建记录.

这种结构使得每餐都可以直接获得可变数量的物品,而不会浪费大量空间.您可以通过相对简单的查询确定膳食中物品的表示,以及确定任何一个用户在任何给定时间段内消耗的物品总数.

此规范化表结构将支持非常大量的记录,并支持对数据库的大量查询.