我如何设置元表,以便有效地插入大量数据?

我正在做一个调查项目,正在寻找最好的方法来跟踪关系数据库中的响应数据.假设调查记录了人们最喜欢的食物.稍后,我将向新食品(卡路里)添加其他数据.我认为我的表格应该看起来像这样:

id | name
==================
1  | John
2  | Suzy
3  | Joe
4  | Laura
5  | Bob

食物

id  | food       | calories
============================
10  | spaghetti  | 950
11  | meatloaf   | 850
12  | tofu       | 600
13  | cake       | 550

选择

**people_food**
------------------
1   |  10
2   |  11
3   |  12
4   |  13
5   |  10

这样做很不错,它使我可以将整数用于表之间的连接-这使得执行JOIN的速度更快,并避免了重复数据的出现.我认为不利的一面是,在插入新数据之前,我必须先在foods表上进行ID查找,以确保要添加的食物不存在.

对于一个小型数据库来说,这足够简单,但是如果我决定要向人们询问他们最喜欢的100种食物,并且该调查将要发送给成千上万的人呢?即使在食物表上有一个索引,这也意味着每次我们插入100个选择时,我们都需要查询食物以获取现有食物的ID. (这是否意味着100条查询?)我想我可能会做些类似的事情:

foreach($response as $food)
{
    $food_id = my_MysqL_function('select id from foods where food = "spaghetti"');

    if( ! $food_id ){
      $food_id = my_MysqL_function_return_query_id( "insert into foods (NULL, '$food')" );
    }

    my_MysqL_function( "insert into people_foods ($person_id, $food_id)" );

}

我想另一种方法是将食物名称用作食物表的主键,并删除整数,但这似乎是一种不好的做法,不会将其自身用于重复数据删除,而且也会减慢我所了解的查询.

问题

使用这样的模式,记录新响应并获取现有食物的ID或插入食物的最有效方法是什么?如果我要插入100种食物,我通常会执行以下操作:

$existing = my_MysqL_function('select id, food from foods where food in ('.implode($response,',').')');
foreach($existing as $food){
   my_MysqL_function_return_query_id( "insert into people_foods ($person_id, '$food['id']')" );
   unset($response[$food]);
}

foreach($response as $food){
 //same code as above mentioned earlier in the question
}

或者,是否仅存在另一个表架构会更好地执行此类操作?

解决方法:

不用担心这些选择的速度.只要确保您有一个来自食物表的食物索引,它就可以存储数百万行,然后再获取一行就成为瓶颈.

不要陷入很快就进行优化的陷阱,也不要认为事情会变慢.请先尝试.

我喜欢“真正的”键,因此我将把食物作为主键并跳过ID,但是正如您所说的那样,在int上连接会更快.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...