我创建了一个表格来插入我的应用程序的所有文档。这是一个简单的表(我们称之为 DOC_DATA),它有 3 个字段:DOC_ID、FileSize、Data。数据是 varbinary(max)。
然后我有许多表(CUSTOMERS_DOCUMENTS、EMPLOYEES_DOCUMENTS、...),其中包含其他数据(如“文档描述”、“创建者”、“客户 ID”...)。我的情况不完全是这样,反正写这个例子我可以更好的表达自己。所有这些表都有一个对 DOC_DATA.DOC_ID 的 FK)。
当用户搜索客户文档时,他将运行类似于以下的查询:
select CD.*, DD.FileSize
from DOC_DATA DD
join CUSTOMERS_DOCUMENTS CD ON CD.DOC_ID = DD.DOC_ID
我的问题是:这个查询的性能会很差,因为我们还要从一个可能很大的表中读取一个字段(DOC_DATA 表可以包含许多 GB 的数据)或者这不是问题吗?
另一种解决方案是将 FIleSize 字段放在所有主表(CUSTOMER_DOCUMENTS、EMPLOYEES_DOCUMENTS、...)中。当然 join 对性能的影响不大,现在我不是在问一般的 join or not join,而是 join or not to join HUGE table,而我对 HUGE 字段不感兴趣。
请注意:我不是在设计一个新系统,而是在维护一个遗留系统,所以在这里我不讨论一般来说哪个是最好的设计,而只是在这种情况下哪个是最好的选择。