【发布时间】:2010-10-04 12:49:59
【问题描述】:
我有这些表:
Projects(projectID, CreatedByID)
Employees(empID,depID)
Departments(depID,OfficeID)
Offices(officeID)
CreatedByID 是foreign key 的Employees。我有一个几乎在每次页面加载时都会运行的查询。
只在Projects 中添加一个冗余的OfficeID 列以消除三个连接是不好的做法吗?或者我应该执行以下操作:
SELECT *
FROM Projects P
JOIN Employees E ON P.CreatedBY = E.EmpID
JOIN Departments D ON E.DepID = D.DepID
JOIN Offices O ON D.officeID = O.officeID
WHERE O.officeID = @SomeOfficeID
在应用程序编程中,我“先编写最佳实践,然后再优化”,但数据库管理员总是警告连接成本。
【问题讨论】:
-
您需要更好的 dbas,数据库中需要连接,并且它们已针对使用它们进行了优化。只有当您的 dbas 没有充分索引(FKS 需要索引)或数据量很大时,它们才会非常昂贵。即使在那儿,我也知道有些人拥有 TB 大小的数据库,但他们仍然使用联接。
-
并且不要使用 select *。当你有一个内部连接时,你返回的列比你定义的要多(相同的数据在连接中的两列中,否则不会返回任何记录),如果你使用 select *,这可能会减慢速度,尤其是敌人每一个查询。永远不要返回超过你需要的东西。
标签: sql database-design database-normalization