我们有来自不同国家/地区的客户使用我们的Grails网络应用程序使用他们自己的母语(瑞典语,挪威语,波兰语,德语,西班牙语等),他们可以保存本地数据。一个示例是Customer表,其中包含名称和姓氏的列,需要按照本地语言的预期进行排序。这意味着:
德国客户希望根据整理utf8mb4_german2_ci对客户列表进行排序,该排序将按预期排序ß/ ss / u /ü。
其他语言的类似案例,如挪威语,波兰语等。
我们所有的列都有字符集utf8mb4,可以支持多种语言的字符存储。
之前我们使用utf8mb4_swedish_ci作为我们可以排序的所有列的排序规则,但由于我们从其他国家和语言获得客户并转向国际市场,我们需要实施变更以支持全球客户。
我们正在调查以下解决方案:
上述哪些解决方案是关于性能,实施时间和可维护性的最佳方法?
答案 0 :(得分:0)
让我们试着总结一下。
我会立即放弃在应用层上对记录进行排序的想法。所有表数据都必须从数据库检索到应用程序,这很快就会成为瓶颈,这也需要额外的编程。
将排序规则应用于特定的选择查询:最少的编程量,但MySQL必须将所有记录复制到临时表,使用给定的排序规则对其进行排序,然后以前30条记录为例。这将比您的应用程序更有效地完成,但随着您的表的增长,它将花费越来越多的时间和内存。但是,对于成千上万的客户来说,这是完全可以接受的方法。
如果您希望有更多客户并希望优化性能和服务器负载,则可以使用其他列,使用所需的排序规则索引:name_swe,name_ger等。您的应用程序可以将每个客户的名称存储到所有列中,并且只能从那个人有必要的整理。这需要额外的编程和冗余存储,但您只需按所需顺序读取所需数据,无需临时表和其他处理。
以下是有关如何尝试使此附加列对您的应用程序透明的一些想法:
此方法的另一个版本是按客户所在国家/地区将客户表拆分为多个表,每个表都需要进行整理。您可以将此表联合以选择所有客户。
也许某些DBMS可以在同一列上有多个不同排序规则的索引 - 这样可以用最少的努力解决问题,但据我所知,mysql不允许这样做。
我个人会首先为选择查询设置排序规则,并在需要时采取性能优化措施。