2017-03-17 74 views
0

我正在开发一个Grails应用程序来替换已运行多年的桌面数据库应用程序(事实上自1991年以来以各种形式)。有一张销售表,其中包含销售可追溯到25年。然而,大部分时间我感兴趣的只是一组仍然活跃的销售,可能还有一个月左右的时间。我不希望搜索等被大量的旧数据拖累。但是,我确实需要访问某些地方的旧数据以进行存档搜索。Grails和MySQL分区

解决这个问题的一个显而易见的方法是建立一个单独的域类,比如说ArchivedSale,它具有与Sale相同的属性,一旦销售不再活跃(数据已发布到账户中)从中创建一个ArchivedSale并删除原件。不过,这确实让我感到不习惯重复自己的原则 - 我不得不在两个地方做任何领域类的改变,这不是一个好主意。

但是,如果我使用MySQL分区,也许我不需要关心自己的性能。我可以将所有销售日期设定为2015年和更早的日期,并将其他日期设置在另一个分区中,这样可以很好地解决任何性能问题。尽管如此,我从来没有使用过分区,并且对它进行了阅读。我有点担心,因为主分区似乎需要在分区标准中使用,并且我知道我无法真正玩弄MySQL主键,因为它们对于Grails的工作方式至关重要。

我想知道有没有人做过与Grails类似的任何事情,并且可以给我一些提示?或者,如果没有这个,是否有另一个解决我可能忽略的问题的好方法?

+1

如果没有适当的指标可用,并且正在使用,而SQL已被调整,那么MySQL分区可提高某些查询的性能,在某些非常特殊的情况。 (这些查询必须特别用*谓词书写,这些谓词允许MySQL优化器进行“分区修剪”)。但是,在分区真正发挥作用的地方是管理大量数据,极大地提高了某些操作的效率(例如清空整个分区),并提供更多可管理的设置。分区本身并不是改善性能的灵丹妙药。 – spencer7593

+0

另一种可能性是有两个数据源,一个一旦设置就不会被操纵,另一个可以保持清理最新信息。仔细地做它来管理你如何管理它,但这意味着你写交易一次到两个分贝。这是答案不要重复自己 – Vahid

+0

是否有可能为同一个域类使用两个数据源? –

回答

1

我想你可能会用不同的表格来创建东西,但我会用继承和每个子类的表来实现它。

http://docs.grails.org/3.0.17/guide/GORM.html#inheritanceInGORM

+0

这看起来像是一个很好的解决方案。我会有一个Sale类和ArchivedSale子类,如你所建议的那样,每个子类的表策略。这应该很好地处理任何性能问题,我会想象。 –