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