【问题标题】:Sort customers by name according to country/language specific collation rules in a MySQL database根据 MySQL 数据库中的国家/语言特定排序规则按名称对客户进行排序
【发布时间】:2018-04-17 06:10:25
【问题描述】:

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

  • 一位瑞典客户希望根据排序规则 utf8mb4_swedish_ci 对客户列表进行排序,该排序规则将按预期对 a/o/å/ä/ö 进行排序。 Örjan 将排在最后,并且与 Olof 不在同一个位置。
  • 一位德国客户想要根据排序规则 utf8mb4_german2_ci 对客户列表进行排序,该排序规则将按预期排序 ß/ss/u/ü。

  • 挪威语、波兰语等其他语言的类似情况。

我们所有的专栏都有字符集 utf8mb4,以便能够支持存储多种语言的字符。

以前,我们使用 utf8mb4_swedish_ci 作为我们可以排序的所有列的排序规则,但由于我们正在吸引来自其他国家和语言的客户并转向国际市场,我们需要实施更改以支持全球客户。

我们正在研究以下解决方案:

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

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

【问题讨论】:

  • 您想要一份来自所有国家/地区的完整客户列表,以某种方式“正确”排序?这似乎是不可能的——想想中文、从右到左的文字等等。也许您可以按客户国家或语言组对您的列表进行分组。
  • 您也可以将排序规则应用于查询,而不是表:SELECT k FROM t1 ORDER BY k COLLATE latin1_german2_ci。但这不允许您使用索引。因此,一切都取决于您要实现的目标。
  • 我们的每个管理用户(可能位于不同的国家,如瑞典、波兰、德国等)只需要对他们自己的客户进行分类。但是所有客户都存储在同一个客户表中。是的,查询的排序规则是我上面介绍的解决方案之一。正如你所说,它会对性能产生影响,我们需要重写我们所有的应用程序逻辑。我们正在寻找一种更简单的解决方案,它只能在数据库中应用,因此我们不需要过多地重写我们的数据访问代码。

标签: mysql sorting grails web internationalization


【解决方案1】:

让我们试着总结一下。

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

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

如果您希望有更多客户并希望优化性能和服务器负载,您可以使用附加列,并使用所需的排序规则进行索引:name_swe、name_ger 等。您的应用程序可以将每个客户的姓名存储到所有这些列中,并且仅从以下列中进行选择具有所需排序规则的那个。这需要额外的编程和冗余存储,但您将仅按所需顺序读取所需数据,无需临时表和额外处理。

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

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

此方法的另一个版本是按客户所在国家/地区将客户表拆分为多个表,每个表都有所需的排序规则。您可以联合这些表来选择所有客户。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2020-12-15
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-11-04
    相关资源
    最近更新 更多