将表连接在一起的MySQL最佳实践,以便您可以通过一个查询获取所有数据

时间:2013-12-13 21:25:20

标签: php jquery mysql

我在数学课上睡在学校里,无论如何,它听起来像是在微软Access中做了什么。在MySQL中,一切都很好而且清晰。但是我对如何将表链接在一起感到困惑。

我目前使用这种风格

主要表用户主键 user_id 其他无关键

文档主键 document_id 第二列 user_id (来自用户表)

计划主键 document_id 第二列 user_id (来自用户表)

访谈主键 document_id 第二列 user_id (来自用户表)

以及另外20个通过user_id相互连接的表。

并在页面中我执行一个查询,其中我加入所有表。有时10个表或20个表如下所示加入,没有任何速度问题平均需要大约1秒才能运行查询。 速度提示 - 根据您在LEFT JOIN标准中使用的列,在其他表中包含索引或为数字。

SELECT users.first_name,
       documents.document_date,
       interview.interview_result,
       ...
  FROM users
    LEFT JOIN documents ON documents.user_id = users.user_id    
    LEFT JOIN interview ON documents.user_id = users.user_id    
    ...
      LIMIT 0, 20

我知道有些人会像5个不同的查询一样编码顺序(一个查询选择在另一个查询中使用的数据,例如循环,然后使用来自第二个查询的数据,在第三个查询条件中使用循环或smth)或者从5个表中独立选择数据然后在PHP中根据用户ID将它们连接在一起。

同样在表格内我每个用户有几条记录,例如在“文档”中,每个用户对于我们需要的每个文档都有几条记录,它们的区别在于“document_type”字段。

然而,我必须做一个页面,我从每个表中获取用户的所有数据,因此查询不太实际,而且执行起来很慢。

SELECT users.first_name,
       doc_resume.document_date AS resume_date,
       doc_passport.document_date AS passport_date,
       doc_photo.document_date AS photo_date,
       interview.interview_result,
       ...
  FROM users
    LEFT JOIN documents AS doc_resume ON doc_resume.user_id = users.user_id WHERE doc_resume.document_type = 1   
    LEFT JOIN documents AS doc_passport ON doc_passport.user_id = users.user_id WHERE doc_passport.document_type = 2   
    LEFT JOIN documents AS doc_photo ON doc_photo.user_id = users.user_id WHERE doc_photo.document_type = 3   
    LEFT JOIN interview ON documents.user_id = users.user_id    
    ...
      LIMIT 0, 20

现在我可能需要设计系统,我必须一直为用户获取所有数据,所以很明显这种用一个查询选择的方法在这种情况下并不是最好的。

现在的问题:

我宁愿独立选择,然后加入PHP或者有组织数据库的方法,所以我可以在一个查询中完成所有操作?

我在想,如果我不把 user_id 放在每个表中,而是有一个名为“link_table”的表,我有 主键“link_id”(未使用),第二列 user_id ,第三列 document_id (来自文档表的键)第四列 interview_id (来自面试表)

但是在写完这个问题之后,我意识到在链接表中,每个用户仍然会有很多记录,例如对于文档中的每条记录,我会在链接表中记录 link_table ,因此它实际上没有解决任何问题。或者我错了。

编辑: 实际上我想知道的不是速度,而是我应该使用专用的表来连接表还是没有比速度还有其他优点/缺点吗?

0 个答案:

没有答案