【发布时间】:2013-02-05 22:40:49
【问题描述】:
我有一个学区数据库(其中约 15,000 个,并且还在不断增加)以及每个学区的员工可获得的退休计划/福利。数据已经很好地标准化了:
- 地区记录与 0 或 n 个退休计划选项相关联(其中 n
- 地区记录与 0 或 n 个福利相关联(其中 n 与 1 个连接表中的 40 更接近)
- 一个地区还与其他一些关联数量很少的事物相关联。
现在客户想要报告。他们希望以一种非常动态的方式进行报告(想想一个 iTunes 智能播放列表,其中可以为任何地区、计划或福利的任何财产添加/删除规则)。我需要允许他们查询某个地区的任何财产、退休计划或福利并返回所有内容。
为了使事情简单(目前)并避免重复数据,我设置了几个视图(嘘,我知道)只允许我以任何 1 个区记录有效的方式访问数据与all_retirement_plans 视图的一对一关系和与all_benefits_plans 视图的一对一记录。这为我提供了一组干净的连接,从而产生了一个统一的结果集,但显然有它自己的一组问题,我将尽快解决这些问题......
也就是说,随着更多数据的添加,它会变得荒谬。
我正在寻找一些关于非规范化的建议。我考虑过一个报表,它可以完成视图的功能,但可以被索引。我还考虑过将整套地区数据转储到 MongoDB(或类似的)。我确信还有其他选择,但我会玩试错游戏,所以我希望这里的人能以一种让我保持在合理解决方案的范围内的方式向我提供建议。
最重要的是,我需要能够存储大约 15,000 条(并且还在增长的)地区记录以及大量额外的元数据,然后以非常精细的级别报告这些数据。除了我自己的想法之外,有人有任何想法或建议吗?我正在努力提前解决我知道即将发生的问题。
【问题讨论】:
-
“我已经设置了几个视图(嘘,我知道)...” 视图是 SQL 数据库管理系统的基本功能。当您必须同时使用 views 和 shhh 时,您应该考虑切换到不同的 dbms。
-
我有点傻,但事实是,视图可能不是满足这种特殊需求的正确平台。考虑到数据的大小(特别是非规范化后的列数),视图的速度与我预期的一样慢。我不知道有什么方法可以优化它们,但我很想弄错。
-
获得更好性能的一种方法是切换到具有更好查询优化器的 dbms。
-
那么这些
all_retirement_plans和all_benefits_plans视图是否使用GROUP_CONCAT来聚合和连接所有不同的字符串? -
@ruakh - 如果我理解你的问题,不。没有进行字符串连接。我面前没有确切的数字,但每个地区可能有 0 个或更多约 30 种不同的福利,并且福利记录有一些属性。
all_benefits_pans视图包含一个地区记录,其中包含每个福利的每个属性。它最多可添加约 100 列。
标签: mysql optimization nosql denormalization