除非您有其他要求(例如可扩展性/冗余),否则最好的方法是将所有内容保存在单个数据库实例中,定义一个收集您感兴趣的所有国家/地区的表(以及它们特定于国家/地区的属性)。
例如:
Country-cd |Country-Name | Currency | Language | Time-zone | Region-cd
it Italy EUR IT MET EMEA
... ... ... ... ... ...
jp Japan JPY jp JST Far-East
然后使用国家代码作为可能具有特定国家内容的其他表的键的一部分......比如价格:
Item-id | Country-cd | Valid-from | Valid-to | Amount x unit
950595 | IT | 03-MAY-2013 | 31-DEC-2099| 23.56
950595 | JP | 01-FEB-2013 | 12-AUG-2013| 2643.00
950595 | JP | 13-AUG-2013 | 31-DEC-2099| 2810.00
因此,同款商品在意大利售价为 23.56 欧元,而在 2 月 1 日至 8 月 12 日期间,它将以 2643 日元的价格在日本出售,然后价格将上涨至 2810 日元。
几个警告
- 我使用了国家和货币的 ISO 代码。这应该足够强大以避免将来出现问题。为了上帝的爱,请勿将特定于应用程序的代码用于状态或货币等内容。即使你是为世界的一小部分设计它,比如,不知道......“德语国家”(德国、奥地利、瑞士的一部分)抵制使用 GER/AUS/SWI 之类的东西或任何其他东西的诱惑不标准。
- 时区管理起来非常麻烦。我把它和国家放在同一张表中只是为了说明什么样的数据应该与国家条目相关联,但实际上有些国家跨越多个时区(俄罗斯、美国),因此您可能需要一个更复杂的模式。
- 在上面的第 (2) 点之上,如果您的应用程序真的存在于单实例数据库中,您必须确定如何向用户显示时间的规则并坚持下去。始终如一。见下文。
跨世界应用程序的问题在于,您可能在班加罗尔拥有一台服务器,而用户在罗马。因此,您基本上有两种选择-您可以使用实际服务器“驻留”的时区为每个操作添加时间戳,并让用户根据差异进行心理调整,或者您仍然使用特定时区为所有操作添加时间戳(您当然可以使用UTC 而不是本地时间,这也适用于其他方法)并在显示时自动将其转换为用户本地时区。
因此,您的数据库中可能会存储“在 UTC 2014 年 5 月 12 日 00:34 创建的记录”之类的内容,并向我显示“记录是在 2014 年 5 月 12 日 01:34 MET 创建的”,因为我正在使用您来自意大利的应用程序.
(这将证明对用户来说更容易,特别是如果应用程序允许他们创建带有时间作为输入的条目 - 例如预订会议室 - 但在开发方面会花费您更多,并且可能会变得有点复杂管理当可以从不同的时区更新相同的记录时)。
这些是基础知识,真的……当然,您还必须阅读有关I18N的内容,并决定是否希望错误消息和 UI 标签是多语言的。I18N 主要关心这一点(即如何管理不同语言的输入和输出),但它也为更深奥的东西提供了指导,比如文化上的图标,所以我建议对它做一些研究。