数据库:最佳实践国家,国家代码,国家电话代码

1sbrub3j  于 2021-06-25  发布在  Mysql
关注(0)|答案(3)|浏览(623)

我正在寻找一个“最佳做法”,如果你存储在一个数据库的国家代码,但找不到一个“这是正确的方式”。我想存储2个字符的国家代码和国家电话代码(如德国将是“de”和“+49”)。
实际上我的计划是:创建一个表 countries 一张table country_codes . 像这样:

TABLE: countries
id INT(11)
code CHAR(2)

TABLE: country_codes
id INT(11)
country_id INT(11) FORGEIGN KEY (countries -> id)
phone_code VARHAR(6)

我想我需要把它们分开,因为有些国家有不止一个电话号码。这样一个国家就可以有多个电话号码。
但我的问题是:这是做到这一点的“最佳做法”吗?如果我想在“所有”国家推出我的应用程序,或者如果我想用多种语言翻译应用程序(在这种情况下,我想使用 countries 表也适用于不同的语言。
如果你想用任何语言翻译你的应用程序而不需要重新编码,如果你还需要一个应用程序中所有国家的列表,你是怎么做的?
如果它应该是重要的:我计划去拉威尔为这个应用程序。

voase2hg

voase2hg1#

我的数据库如下所示:

> id    int(11) Auto Increment (Just an ID (primary key))
> iso   char(2)  (2-letters ISO code)
> name  varchar(80)  (normalized name (all uppercase))
> nicename  varchar(80)  (Nicely formatted name)
> iso3  char(3) NULL     (3-letters ISO code)
> numcode   smallint(6) NULL     (numeric ISO code)
> phonecode int(5) (phone code like '1' for USA, without '+')

应该足够了。你得到用户的电话号码,删除零开始,删除任何非数字字符,添加一个国家代码从数据库和你很好去!
例子:
1) 用户输入(045)111-22-33,德国
2) 你把它转换成451112233
3) 增加db的德国代码(49)。你得到49451112233。如果愿意,可以加上“+”。
4) 现在你可以打电话或发送短信与twilio或任何其他服务。
如果您想“轻松”地将网站翻译成其他语言,请将所有文本存储在数据库中,并根据用户的语言偏好选择正确的版本。

kx7yvsdv

kx7yvsdv2#

国家代码由iso3166-1-alpha-2标准化为两个字母,因此以这种方式存储它们是可行的。在表中包含国家名称通常很有帮助,这样用户就可以选择正确的国家,而不必知道所有代码。
电话号码远没有标准化。国际电联提出建议e.164,用以表示实际电话号码(在电话术语中称为“目录号码”)。国家代码定义为一到三位数字。北美(包括美国、加拿大和许多加勒比国家)都是北美编号计划的一部分,并共享国家代码 1 .
目录号通常以+开头,并以点为标点。因此,例如,公布的纽约市目录援助号码是(或者他们仍然有这样的服务时是) +1.212.555.1212 . 如果你从欧洲某地打这个号码,你会看到 + 并替换您当地的国际前缀。在nanp,多个国家有相同的国家代码。
但是,英国很奇怪。从国外打来的电话 +44.exchange.number . 但是从国内打长途 (0) exchange.number .
我的观点是:如果你试图用软件中的国家代码来编写目录号,那就很难做到正确。最好让用户提供带有国际前缀的电话号码。
您绝对不应该将e.164国家代码与iso3166两个字母的国家代码绑定在一起,将它们作为不同的列放在表的同一行上。你需要两张分开的table来防患于未然。标准化组织是不同的,他们做自己的事情,所以您的数据模型应该反映这一点。
读一下:程序员相信电话号码是假的。

pxiryf3j

pxiryf3j3#

根据答案,我将做以下工作:
数据库表:

+------------------------------------------------------------+
| Table: countries                                           |
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int(11)      | NO   |     | NULL    |       |
| iso_code2    | char(2)      | NO   |     | NULL    |       |
| iso_code3    | char(3)      | NO   |     | NULL    |       |
| num_code     | int(3)       | NO   |     | NULL    |       |
| name         | varchar(48)  | NO   |     | NULL    |       |
| nicename     | varchar(48)  | NO   |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
// will store all countries available

+------------------------------------------------------------+
| Table: country_phonecodes                                  |
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int(11)      | NO   |     | NULL    |       |
| country_id   | int(11)      | NO   |     | NULL    |       |
| phonce_code  | int(6)       | NO   |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
// based on this page: https://countrycode.org/ there are 
// countries with more than one code 
// and also codes can be 6 chars long

+------------------------------------------------------------+
| Table: languages                                           |
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int(11)      | NO   |     | NULL    |       |
| code         | char(2)      | NO   |     | NULL    |       |
| locale       | char(5)      | NO   |     | NULL    |       |
| name         | varchar(50)  | NO   |     | NULL    |       |
| native_name  | varchar(50)  | NO   |     | NULL    |       |
| flag         | varchar(10)  | NO   |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
// table for available translations of the app

+------------------------------------------------------------+
| Table: country_languages                                   |
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int(11)      | NO   |     | NULL    |       |
| country_id   | int(11)      | NO   |     | NULL    |       |
| language_id  | int(11)      | NO   |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
// table for language suggestions for a given country

以及一些示例插入:

+---------------------------------------------------------------------------------------+
| Inserts: countries                                                                    |
+-----+------------+------------+-----------+---------------------+---------------------+
| id  | iso_code2  | iso_code3  | num_code  | name                | nicename            |
+-----+------------+------------+-----------+---------------------+---------------------+
| 1   | de         | deu        | 276       | GERMANY             | Germany             |
| 2   | do         | dom        | 214       | DOMINICAN REPUBLIC  | Dominican Republic  |
| 3   | be         | bel        | 056       | BELGIUM             | Belgium             |
+-----+------------+------------+-----------+---------------------+---------------------+

+----------------------------------+
| Inserts: country_phonecodes      |
+-----+-------------+--------------+
| id  | country_id  | phonce_code  |
+-----+-------------+--------------+
| 1   | 1           | 49           |
| 2   | 2           | 1809         |
| 3   | 2           | 1829         |
| 4   | 2           | 1849         |
| 5   | 3           | 32           |
+-----+-------------+--------------+

+----------------------------------------------------------+
| Inserts: languages                                       |
+-----+-------+---------+---------+--------------+---------+
| id  | code  | locale  | name    | native_name  | flag    |
+-----+-------+---------+---------+--------------+---------+
| 1   | de    | de_DE   | German  | Deutsch      | de.svg  |
| 2   | do    | es_DO   | Spanish | Español      | es.png  |
| 3   | be    | fr_BE   | French  | Français     | fr.jpg  |
| 4   | be    | nl_BE   | Dutch   | Nederlands   | nl.png  |
| 5   | be    | de_BE   | German  | Deutsch      | de.svg  |
+-----+-------+---------+---------+--------------+---------+

+----------------------------------+
| Inserts: country_languages       |
+-----+-------------+--------------+
| id  | country_id  | language_id  |
+-----+-------------+--------------+
| 1   | 1           | 1            |
| 2   | 2           | 2            |
| 3   | 3           | 3            |
| 4   | 3           | 4            |
| 5   | 3           | 5            |
+-----+-------------+--------------+

我认为这应该是工作,并适用于任何项目的国家名单和/或i18n是需要的。
如果用户来自比利时,他可以从可用语言/翻译列表中进行选择。他会得到一个关于fr,nl和de的建议,但仍然可以选择 es_DO 作为首选语言。
我认为这应该涵盖所有的需求——但是如果有人看到其中的问题或者有想法/意见:如果我能改进这个解决方案,我会很高兴:)

相关问题