【发布时间】:2012-12-28 10:57:47
【问题描述】:
我有一个包含 4 个表的 MySQL 数据库:
job
job_application
client
candidate
每个表都有自己的主键,即job_id、job_application_id、client_id、candidate_id
client 表中的雇主可以在job 表中发布职位。 job 表包含一个标识客户端的client_id 字段
candidate 表中的候选人可以申请工作,在job_application 表中插入一行。 job_application 表包含一个 job_id 字段和一个 candidate_id 字段,用于标识工作是什么以及谁申请了它
我在为雇主编写查询以管理他们收到的工作申请时遇到了一些问题。举个例子,我写的一个函数从job_application中删除行
public function deleteJobApplications($job_application_ids) {
$this->db->query("DELETE ja.* FROM " . DB_PREFIX . "job_application ja LEFT JOIN " . DB_PREFIX . "job j ON (j.job_id = ja.job_id) WHERE ja.job_application_id IN ('" . implode("','", array_map('intval', $job_application_ids)) . "') AND j.client_id = '" . (int)$this->client->getClientId() . "'");
}
因为client_id 只在job 表中被引用,所以每次我想从job_application 表中UPDATE 或DELETE 时,我都需要LEFT JOIN job 表
我应该在job_application 表中添加另一个client_id 字段,本质上是复制数据库中已经保存的数据,还是继续为每个UPDATE 和DELETE 使用LEFT JOIN?
【问题讨论】:
-
为了速度和复杂性最小化而拥有冗余数据对数据库来说并不陌生,关键是平衡
-
我想说复制外键是提高数据库性能的正确做法,你必须确保表保持一致。尝试一些性能测试(大量数据集),看看它是否对您有很大帮助
-
我认为你应该检查 indexex,做一些“解释”,我确实在一个像样的服务器上在不到一毫秒的时间内离开了具有 +100m 行的表(平均约为 4ms) ,不是高科技。我不认为你有那么多行,左连接应该可以正常工作。
-
Cross referencedtable 是包含外键的典型案例。索引可以使一个巨大的表更快。所以你可以检查那些。 +1 拉杜 -
我不确定您在这里要做什么,但应该由
jobID.. 删除作业。客户端可以删除或更新作业,job_application表应该处理@987654352 @ 该特定请求。有什么特殊原因不能使用jobID?
标签: mysql database-design indexing database-performance