我在数学课上睡在学校里,无论如何,它听起来像是在微软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 ,因此它实际上没有解决任何问题。或者我错了。
编辑: 实际上我想知道的不是速度,而是我应该使用专用的表来连接表还是没有比速度还有其他优点/缺点吗?