база данных: лучшие практики стран, коды стран, телефонные коды стран - PullRequest
0 голосов
/ 06 мая 2018

Я ищу «лучшую практику», если вы храните коды стран в базе данных, но не можете найти «это правильный путь» для этого. Я хочу сохранить 2-значный код страны, а также телефонные коды страны (например, Германия будет "DE" и "+49").

На самом деле мой план таков: создайте одну таблицу countries и одну таблицу с 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 таблица также для разных языков.

Как вы поступаете, например, как, если вы хотите перевести свое приложение на любой язык без необходимости перекодирования, и если вам также нужен список всех стран в вашем приложении?

Если это имеет значение: я собираюсь пойти с Laravel для этого приложения.

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Коды стран стандартизированы на две буквы по ISO 3166-1-alpha-2 , поэтому их хранение будет работать. Часто бывает полезно включить название страны в таблицу, чтобы пользователь мог выбрать правильную страну, не зная всех кодов.

Номера телефонов гораздо менее стандартизированы. МСЭ предлагает рекомендацию E.164 для представления фактических телефонных номеров (называемых "номерами справочников" на языке телефонии). Коды стран определяются от одной до трех цифр. Северная Америка (включая США, Канаду и многие карибские страны) - все они являются частью Североамериканского плана нумерации и имеют общий код страны 1.

Справочным номерам обычно предшествует + и пунктирная точка. Так, например, опубликованный номер справочной службы города Нью-Йорка (или был, когда у них еще была такая услуга) +1.212.555.1212. Если вы позвоните по этому номеру из какой-либо страны Европы, вы увидите + и подставите свой местный международный префикс. В NANP несколько стран имеют одинаковый код страны.

Но Великобритания странная. Звоните из-за границы, это +44.exchange.number. Но звонить на большие расстояния внутри страны - это (0) exchange.number.

Моя точка зрения: трудно понять это правильно, если вы попытаетесь составить номера каталогов с кодом страны в своем программном обеспечении. Вам, вероятно, лучше попросить пользователей предоставить свои номера телефонов с международным префиксом.

Вам определенно не следует привязывать коды стран E.164 к двухбуквенным кодам стран ISO 3166, помещая их в разные столбцы в одной строке таблицы. Вам нужно две отдельные таблицы, чтобы быть на будущее. Организации по стандартизации отличаются друг от друга и занимаются своими делами, поэтому ваша модель данных должна отражать это.

Прочитайте это: Программисты лжи верят в номера телефонов .

0 голосов
/ 06 мая 2018

На основании ответов я бы сделал следующее:

Таблицы БД:

+------------------------------------------------------------+
| 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 в качестве предпочтительного языка.

Думаю, что это должно охватывать все потребности, но если кто-то видит в этом проблему или у него есть идеи / комментарии: я был бы рад, если смогу улучшить это решение:)

0 голосов
/ 06 мая 2018

Моя БД выглядит так:

> 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) Добавить код Германии (49) из БД. Вы получите 49451112233. Добавьте «+», если хотите.

4) Теперь вы можете позвонить или отправить SMS с помощью Twilio или любой другой услуги.

Если вы хотите «легко» перевести сайт на другие языки, сохраните весь свой текст в базе данных и выберите нужную версию в зависимости от языковых предпочтений пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...