根据MySQL数据库中的国家/语言特定的排序规则按名称对客户进行排序

时间:2017-11-04 18:11:34

标签: mysql sorting grails web internationalization

我们有来自不同国家/地区的客户使用我们的Grails网络应用程序使用他们自己的母语(瑞典语,挪威语,波兰语,德语,西班牙语等),他们可以保存本地数据。一个示例是Customer表,其中包含名称和姓氏的列,需要按照本地语言的预期进行排序。这意味着:

  • 瑞典客户希望根据整理utf8mb4_swedish_ci对客户列表进行排序,该排序将按预期排序a / o /å/ä/ö。 Örjan将排在最后,而不是与Olof在同一个地方。
  • 德国客户希望根据整理utf8mb4_german2_ci对客户列表进行排序,该排序将按预期排序ß/ ss / u /ü。

  • 其他语言的类似案例,如挪威语,波兰语等。

我们所有的列都有字符集utf8mb4,可以支持多种语言的字符存储。

之前我们使用utf8mb4_swedish_ci作为我们可以排序的所有列的排序规则,但由于我们从其他国家和语言获得客户并转向国际市场,我们需要实施变更以支持全球客户。

我们正在调查以下解决方案:

  • 在数据库中使用utf8mb4_unicode_ci作为排序规则,但是根据应用程序中使用的语言/位置,在我们的所有查询中添加一个整理表达式,例如“order by firstname collat​​e utf8mb4_swedish_ci”。
  • 在数据库中使用具有目标归类的多个列,如“firstname_swedish”(utf8mb4_swedish_ci),“firstname_german”(utf8mb4_german2)或引用具有不同列的特定表。
  • 在应用程序层而不是数据库中实现排序。

上述哪些解决方案是关于性能,实施时间和可维护性的最佳方法?

1 个答案:

答案 0 :(得分:0)

让我们试着总结一下。

我会立即放弃在应用层上对记录进行排序的想法。所有表数据都必须从数据库检索到应用程序,这很快就会成为瓶颈,这也需要额外的编程。

将排序规则应用于特定的选择查询:最少的编程量,但MySQL必须将所有记录复制到临时表,使用给定的排序规则对其进行排序,然后以前30条记录为例。这将比您的应用程序更有效地完成,但随着您的表的增长,它将花费越来越多的时间和内存。但是,对于成千上万的客户来说,这是完全可以接受的方法。

如果您希望有更多客户并希望优化性能和服务器负载,则可以使用其他列,使用所需的排序规则索引:name_swe,name_ger等。您的应用程序可以将每个客户的名称存储到所有列中,并且只能从那个人有必要的整理。这需要额外的编程和冗余存储,但您只需按所需顺序读取所需数据,无需临时表和其他处理。

以下是有关如何尝试使此附加列对您的应用程序透明的一些想法:

  • 您可以使用MySQL生成的列或触发器自动填充具有不同排序规则的列 - 因此应用程序必须仅为“名称”列插入/更新数据
  • 执行选择查询时,您可以将“name_swe”,“name_ger”列别名为“name” - 因此应用程序必须只读取单个结果列

此方法的另一个版本是按客户所在国家/地区将客户表拆分为多个表,每个表都需要进行整理。您可以将此表联合以选择所有客户。

也许某些DBMS可以在同一列上有多个不同排序规则的索引 - 这样可以用最少的努力解决问题,但据我所知,mysql不允许这样做。

我个人会首先为选择查询设置排序规则,并在需要时采取性能优化措施。