php - 这个问题应该如何设计数据库结构呢?

标签 php mysql database performance database-design

我正在为一个流量很大的网站重建后台系统。

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

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

Simplified, the process is more or less this:

  1. 用户到达该网站,该网站列出了他/她当天的选择(如果之前按照以下步骤输入)。
  2. 用户可以加餐(包括 1 种到无限种不同的食物及其数量)。膳食通过搜索字段添加,并按不同类型组织(如“早餐”、“午餐”)。
  3. 在膳食构建过程中,将显示最常用食品的列表(主要由该用户使用,其次也由所有用户使用)以供快速选择。
  4. 膳食将存储在 FoodLog 表中,该表包含如下内容:id、user_id、date、type、food_data

我目前拥有的是一个巨大的数据库,其中包含将从中执行搜索的食品。食品存储有通用名称(如“ pig 排”)和生产商(如“可口可乐”)的信息,以及所需的其他详细信息。

Question summary:

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

假设有 100 万用户每天增加 1 到 7 餐。为了存储每顿饭的每一种食物,每一天,每个用户每天可能会创建 (1*avg_num_meals*avg_num_food_items) 百万行。

以某种压缩方式存储数据(比如 food_data 是一个 json_encoded 字符串),会显着减少行数,但同时很难创建“最常用的食品”列表和其他统计信息即时。

表格是否应该拆分成几张表格?如果是这样,他们将如何互动?

该网站目前托管在中档 CDN 上,并使用 LAMP(Linux、Apache、MySQL、PHP)主干。

最佳答案

粗略地说,您需要一个完全规范化的数据结构。您想要一张用户表,一张膳食表(每餐一个条目,引用用户;您可能还想在此表中包含用餐的时间/日期),以及一张膳食项目表,它只是 Meal 和 Food Items 表之间的关联表。

因此,当用户进入并创建帐户时,您会在用户表中创建一个条目。当用户报告他们吃过的餐时,您会在 Meals 表中创建一条记录,并在 MealItems 表中为他们报告的每个项目创建一条记录。

这种结构使得每顿饭都可以直接使用可变数量的元素,而不会浪费很多空间。您可以通过一个相对简单的查询来确定膳食中的项目表示,以及确定任何一个用户在任何给定时间跨度内消费的项目总数。

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

关于php - 这个问题应该如何设计数据库结构呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6738336/

相关文章:

javascript - 从函数 Javascript 设置变量 PHP 的值

database - PostgreSQL创建表空间没有权限

java - Java/Android Realm - 保留查询/结果的状态

mysql - 在数据库中存储项目属性的组合

mysql - 为什么这个 SQL 脚本只为数据类型为 "varchar"的列生成 SQL?

java - 尝试创建新的数据库 Play Framework ebean mysql 时出现错误

php - 使用 EasyPHP 时出现 PEAR "DB.php"错误

用于计算返回 null 的 (MySql) 查询循环内各行的 PHP 函数

php - 递归删除数组键前缀

php - 在php中执行sql查询不起作用,但查询在phpmyadmin中起作用