Php 数据库:最佳实践国家、国家代码、国家电话代码
我正在寻找一个“最佳实践”,如果你在数据库中存储国家代码,但找不到一个“这是正确的方式”。我想存储2个字符的国家代码和国家电话代码(例如德国将是“DE”和“+49”) 实际上,我的计划如下:创建一个表Php 数据库:最佳实践国家、国家代码、国家电话代码,php,mysql,laravel,laravel-5,internationalization,Php,Mysql,Laravel,Laravel 5,Internationalization,我正在寻找一个“最佳实践”,如果你在数据库中存储国家代码,但找不到一个“这是正确的方式”。我想存储2个字符的国家代码和国家电话代码(例如德国将是“DE”和“+49”) 实际上,我的计划如下:创建一个表countries和一个表country\u code。大概是这样的: TABLE: countries id INT(11) code CHAR(2) TABLE: country_codes id INT(11) country_id INT(11) FORGEIGN KEY (countri
countries
和一个表country\u code
。大概是这样的:
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)
我想我需要把它们分开,因为有些国家有不止一个电话号码。这样,一个国家可以有多个电话号码
但我的问题是:这是做到这一点的“最佳实践”吗?如果我想在“所有”国家/地区推出我的应用程序,或者如果我想将应用程序翻译成多种语言(在这种情况下,我想将国家/地区
表也用于不同的语言),不仅从这一点来看,“这将起作用”,而且从这一角度来看,效果更大
如果你想用任何语言翻译你的应用程序而不需要重新编码,如果你还需要一份应用程序中所有国家的列表,你会怎么做
如果有必要的话:我计划与laravel一起使用此应用程序。我的数据库如下所示:
这应该足够了。您可以获得用户的电话号码,删除开头的零,删除任何非数字字符,从DB中添加国家代码,您就可以开始了
例如:
1) 用户输入(045)111-22-33,德国
2) 您可以将其转换为451112233
3) 从DB中添加德国代码(49)。你得到49451112233。如果愿意,请添加“+”
4) 现在,您可以通过Twilio或任何其他服务拨打电话或发送短信
如果您想“轻松地”将网站翻译成其他语言,请将所有文本存储在数据库中,并根据用户的语言偏好选择正确的版本。国家代码是标准化的,因此以这种方式存储它们是可行的。在表中包含国家名称通常很有帮助,这样用户就可以选择正确的国家,而不必知道所有代码 电话号码远没有标准化。ITU提供了表示实际电话号码(电话术语中称为“目录号码”)的功能。国家代码定义为一到三位数。北美(包括美国、加拿大和许多加勒比海国家)都是美国的一部分,并共享国家代码
1
目录号通常以+开头,并以点为标点。因此,例如,发布的纽约市目录帮助号码是(或在他们仍然有这样的服务时是)+1.212.555.1212
。如果您从欧洲某地拨打该号码,您将看到+
,并替换您当地的国际前缀。在NANP中,多个国籍具有相同的国家代码
但是,英国很奇怪。从国外打来的电话是+44.exchange.number
。但是从国内打长途电话是(0)exchange.number
我的观点是:如果您试图在软件中用国家代码编写目录号,那么很难做到正确。您最好让用户提供带有国际前缀的电话号码
您绝对不应该将E.164国家/地区代码与ISO 3166两个字母的国家/地区代码作为不同的列放在表的同一行中。你需要两张单独的桌子来证明未来的安全。标准化组织是不同的,它们做自己的事情,所以您的数据模型应该反映这一点
阅读以下内容:。根据答案,我将执行以下操作: 数据库表:
+------------------------------------------------------------+
| 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
作为首选语言
我认为这应该涵盖所有需求-但如果有人看到这方面的问题或有想法/意见:如果我能改进此解决方案,我会很高兴:)如果一个国家可以有多个代码,那么设计是正确的。关于lenguage:我不认为有什么需要翻译,我相信国家的缩写是一样的关于lenguage翻译的意思是如果我想翻译我的应用程序(不是国家代码,它们总是一样的,是的)记住,国家可以有多种语言,比如比利时使用荷兰语,法语和德语。@RaymondNijland这正是我想要的:如何处理我需要的所有信息而不需要数据库中的太多信息。然后翻译应该在一个单独的问题表中。country_languages和country_phonecodes不需要自动递增id。您可以使用带有两列的pk
+---------------------------------------------------------------------------------------+
| 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 |
+-----+-------------+--------------+