Portanto, esta será a pergunta fictícia do ano, mas preciso perguntar, já que não é a primeira vez que passo por isso. Dê uma olhada na seguinte definição de tabela:
Dê uma olhada na coluna from_number
que está VARCHAR(45)
no momento, mas ela conterá um número de telefone. Como não sei quantos números um telefone poderia ter em todo o mundo, estou tentando cobrir quase todos eles. Eu quero manter a integridade do banco de dados o máximo possível, para que eu VARCHAR
não seja o tipo adequado para armazenar esse tipo de informação - talvez eu esteja errado, você me diz -, então estou pensando em mudar para INT
ou mesmo BIGINT
.
Ao definir uma coluna no Workbench, devo especificar o número entre parênteses, ()
não em todos os casos, mas naqueles que mencionei anteriormente, tive que fazê-lo. Então, se eu fizer isso: BIGINT()
recebi este erro:
O que me guia a ler um pouco sobre esse tipo de MySQL aqui . Basicamente, a informação é esta:
Um número inteiro grande. ... O intervalo não assinado é de 0 a 18446744073709551615.
O que me faz perguntar: que valor devo definir entre parênteses ao definir um BIGINT()
tipo. (Estou usando o BIGINT porque não sei se o INT pode armazenar tantos números quanto um telefone - talvez eu esteja errado também). Qual é a maneira correta de criar uma coluna nos bancos de dados MariaDB / MySQL?
Enfim, gostaria de saber sua opinião, experiência e, é claro, gostaria de obter uma resposta
Nota: Estou usando a última edição do MySQL Workbench para criar o diagrama de ER. Também estou usando o MariaDB 10.0.x
Respostas:
Como você lidaria com um número de telefone com um ramal, como "+ 1-000-000-0000 ext 1234"?
Observe que o "+" indica que as regras de discagem internacional devem ser aplicadas; portanto, na América do Norte, o sistema conhece automaticamente "011" na frente de chamadas internacionais etc.
Além disso, e os números de telefone como "1-800-DBA-HELP"?
Normalmente, eu armazenava números de telefone como texto. Dito isto, realmente depende da importância da sua coluna de número de telefone. Se você estiver executando discadores automáticos a partir dessa coluna, realmente desejará garantir que apenas números sejam incluídos e que os dados representem números de telefone bem formados.
Você pode ter colunas separadas para ramais e números de telefone com texto, como o exemplo "1-800-DBA-HELP" que eu forneci.
fonte
1-800-DBA-HELP
por ele é dígitosAnteriormente, foi escrito:
"Com o MariaDB, você pode usar um
computed
campo para extrair apenas os dígitos de um discador automático. Também funciona para o MySQL 5.7."Em resposta à pergunta do OP sobre isso ("você pode explicar um pouco o que está me dizendo?"), Aqui está uma explicação.
Muitos sistemas de banco de dados já introduziram esse recurso. Esses são campos conhecidos de várias formas "
computed
", "virtual
" ou "generated
", derivados de valores em outros campos. A potência desse recurso varia de acordo com o seu RDBMS. Eu sei que Oracle, Firebird, MariaDB e agora MySQL 5.7 os têm. Outros provavelmente também o fazem.Um exemplo fácil seria ter uma coluna de sobrenome e uma coluna computada que "armazene" (lembre-se, elas podem ser virtuais - isto é, calculadas dinamicamente ou podem ser fisicamente armazenadas em disco) - o sobrenome como todas as maiúsculas pesquisando mais fácil. Dessa forma, você só precisa pesquisar em
CAP
s (usando, digamos,LIKE
), sabendo que os dados sendo pesquisados no [computed
|virtual
|generated
] está em texto maiúsculo.O conceito para o MySQL 5.7 é explicado aqui e aqui . Ele está no MariaDB há um pouco mais e o conceito também é explicado aqui . Alguns usos possíveis são sugeridos aqui , mas você é realmente limitado apenas pela sua imaginação. Eles podem ser vistos como um substituto conveniente (e menos propenso a erros) aos gatilhos.
Para o seu caso de uso específico, você pode derivar um número discável de um campo de texto "+" -> "00" (ou qualquer que seja o seu código de discagem internacional). Apenas um pensamento.
fonte
virtual
ougenerated
valores. Estou pensando em usoCONCAT
ou em outra coisa, mas não tenho certeza. Além disso, você menciona uma pesquisaCAPS
usando.LIKE
Você também pode dar um exemplo disso? E o desempenho das colunas calculadas em tempo real (virtual) vs persisted (
geradas)?Hmm. Os números de telefone são feitos de números. O uso do varchar permite ao usuário armazenar qualquer tipo de formatação, com (ou não, com - ou. E cria rapidamente uma confusão com seus dados. Um formato de número de telefone é dependente do "país", a máscara deve estar ligada ao país. é uma extensão e é opcional, por isso deve ser armazenada em um "campo de extensão". (int também). Para o 1-800-DBA-HELP, eu o converteria instantaneamente e armazenaria o número real. número de telefone legível por humanos, armazene-o em um campo varchar separado.
fonte
Eu costumo armazenar os números de telefone em texto simples . Formatação e exibição deixam para o código do cliente.
Aqui, mais do que, como você armazena? o que você fará com esse número de telefone é realmente importante.
Se sua empresa deseja realizar chamadas de saída do seu sistema, o aplicativo extrairá apenas números. Se sua empresa deseja fazer chamadas internacionais , armazene o código do país e o código de área em colunas separadas.
Se sua empresa deseja gerar relatórios , o aplicativo será formatado e exibido com ramal e números separadamente.
Do meu entendimento, projetar modelo de dados universal para número de telefone não é uma boa ideia. Cada país possui números, extensões e códigos de área diferentes, além do código do país. Além disso, soube que alguns países não possuem código de área.
Isso pode não responder à sua pergunta, mas ajudará a ampliar nosso entendimento. Obrigado.
fonte