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

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

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上连接会更快.

上一篇:JavaScript-如何使以下代码更快?


下一篇:PHP中的cURL:curl_exec()或exec(‘curl’)?