2013-02-20 66 views
4

我有一个学区数据库(约15,000人和增长)以及退休计划/福利可用于每个员工。该数据是相当不错标准化:反规范化的建议

  • A区记录与
  • A区记录与相关0或ñ退休计划选项(其中ñ < 10铺开3连接表)关联0或n好处(其中n从1个连接的表格更接近于40)
  • 区域还与其他关联数量相似的其他事物相关联。

现在客户想报告。而且他们希望以非常动态的方式进行报告(想想一下iTunes智能播放列表,您可以在任何地区,计划或优惠的任何地方添加/删除规则)。我需要让他们查询某个地区的任何财产,其退休计划或其利益,并返回的一切。为了让事情变得简单(现在)并避免重复的数据,我设置了几个视图(嘘,我知道),它允许我以任何1区记录的方式访问数据与all_retirement_plans视图和all_benefits_plans视图具有一对一的关系,并与all_benefits_plans视图具有一对一的关系。这给了我一套干净的连接,导致了一个统一的结果集,但显然带有它自己的问题,我打算早点击,而不是晚点...

也就是说,它会得到可笑地随着更多数据的添加而变慢。

我在寻找有关反规范化的建议。我曾想过一个报告表,它可以完成视图的工作,但可以编入索引。我也想过把这整个区域数据转储到MongoDB(或类似的)。我相信还有其他的选择,但我会玩试验和错误游戏,所以我希望这里的某个人能够以一种合理的解决方案让我参与进来。

底线是我需要能够存储〜15,000(和增长)的区域记录以及大量额外的元数据,然后以非常细化的级别报告这些数据。除了我自己的想法带给我的任何地方之外,任何人有任何想法或建议吗我试图提前知道我所知道的问题。

+0

*”我已经设置了几个视图(嘘,我知道)......“*视图是SQL数据库管理系统的基本特征。当你必须紧挨着使用* views *和* shhh *时,你应该考虑切换到不同的dbms。 – 2013-02-20 19:29:49

+0

我在那里有点愚蠢,但事实是,对于这种特殊需求,意见可能不是合适的平台。考虑到数据的大小(特别是一旦非规范化的列数),这些观点就像我预期的那样缓慢。我不知道有什么方法来优化它们,但我很想错。 – 2013-02-20 19:41:44

+0

获得更好性能的一种方法是切换到具有更好查询优化器的dbms。 – 2013-02-20 20:01:48

回答

0

我希望这可以帮助,因为我最近在将数据从关系转移到面向文档(反规范化)方面做了大量工作。

与数据移动到Mongo的一些选项:

  1. 您可以轻松地只写从MySQL数据蒙戈并保持你的关系表。没有转换,只需将数据直接移动即可。 Mongo具有可输出到新集合的map/reduce。虽然速度很慢。 =(如果你直接移动一个视图,Mongo有一个非常强大的聚合框架来生成新文档。

  2. 理想情况下,你会在MySQL中编写你的“文档”,然后移动它们。使文档变得非常平坦,你可以通过使用group_concat创意来添加结构,基本上可以将一些数据和手动JSON字符串group_concat在一起。(丑,但它的作品)

  3. 蒙哥是很好在与文件的工作。真的,真的很棒。如果您想使用非规格化数据,我强烈建议使用它。

  4. 这可能是矫枉过正,但我​​们使用Mule ESB将数据从MySQL移动到Mongo。你可以在那里做更复杂/棘手的转换,但是有一条学习曲线。

  5. 在SQL Server中,您可以将查询输出为XML。如果你可以在MySQL中找到一个库来做到这一点,那么这是从XML到JSON的简单跳转。我们已经能够在SQL Server中运行超过10万条记录的查询并且非常快速地输出XML。

让我知道你是否想要更多关于任何点的细节。 =“

+0

谢谢,瑞恩。我首先想确定的是,如果我转移到Mongo,我仍然可以执行非常详细的查询。一个MongoDB“文档”将代表一个区域(包括其所有退休计划/福利数据),因此我可以将这些文件作为嵌套组件包含在内,或者如您所述将所有内容扁平化。听起来像平板更快?我得看看'group_concat'。 – 2013-02-22 22:09:20

+0

Flat更容易从MySQL迁移到Mongo。 Mongo具有非常丰富的查询语言。语法可能需要一些习惯,但你绝对可以完成很多。 group_concat可以创建数组或子文档。 – ryan1234 2013-02-22 22:18:44

+0

最后看看'group_concat'。这不完全是我的。我没有像拼合记录那样拼接字段值。如果一个地区可能有3个可能的福利记录(每个记录都有一个ID和一个提供者),我将每个福利记录平铺到视图中,这样一个地区现在有1个福利记录,带有前缀以区分的字段。例如'accident_insurance_id','accident_insurance_provider','dental_id','dental_provider'等。现在我的'区域'表与这个视图有一对一的关系。 – 2013-02-25 13:45:33