查找表或其他什么?

时间:2013-11-09 21:58:18

标签: sql sql-server database-design

我有8张桌子;

  1. 员工
  2. employee_subjects
  3. 出口
  4. outlet_subjects
  5. 受试者
  6. 地理
  7. outlet_geography
  8. employee_geography
  9. 现在,我需要能够根据一系列子喷气机搜索不同地区的网点和员工。

    我的问题是:是否有一个好的策略,创建一个有点静态的查找表是个好主意,我已经在我的范围内插入了我需要的所有数据?

    该表可能增长到+50万行,但我可以说

    SELECT ... FROM lookup WHERE subId = 1 OR subId = 2 OR geoId = 1 geoId = 2...etc etc.
    

    所以我要保持联接。

    模糊,是的,但我需要这方面的指导!

2 个答案:

答案 0 :(得分:2)

这个问题一般无法回答。在某些情况下,出于性能原因(特别是对于数据仓库),您必须保留冗余的非规范化数据。但是,您不应轻易引入冗余或潜在的不一致。

我建议先测量查询性能并检查执行计划。确保创建所需的所有索引。如果查询结果仍然太慢,您可以考虑使用物化视图(称为sql server的索引视图,请参阅,例如here)。具体化与您建议的表非常相似,但它与DBMS自动保持同步。

答案 1 :(得分:1)

在Datawarehouse上下文中,分析查询(从系统中提取数字和统计数据)可能有意义,但对于用户定期更新的oltp系统,大查找表是一个非常糟糕的设计,难以维护(很多)不需要的数据:并非所有记录都需要所有列等),坏数据等。

保持联接只是为了查询系统听起来也不是一个好主意 因为它可能会破坏Sql Server优化器的工作,并且有更多机会导致表扫描 (用一张大桌子可能很难)。

Here是一篇来自Joe Celko的大型查找表上的一篇有趣的文章,听起来与你的问题有关,不完全相同,但可以给你一些见解。

一般建议是:保持标准化设计(特别是对于和oltp系统)。