Resumo breve:
(apenas minhas opiniões)
- para endereço de e-mail -
VARCHAR(255)
- para nome de usuário -
VARCHAR(100)
ouVARCHAR(255)
- para id_username - use
INT
(a menos que você planeje mais de 2 bilhões de usuários em seu sistema) - números de telefone -
INT
ouVARCHAR
ou talvezCHAR
(depende se você deseja armazenar a formatação) - postagens -
TEXT
- datas -
DATE
ouDATETIME
(definitivamente inclua horários para coisas como postagens ou e-mails) - dinheiro -
DECIMAL(11,2)
- diversos - veja abaixo
Quanto ao uso do InnoDB porque
VARCHAR
é suposto ser mais rápido, eu não me preocuparia com isso, ou velocidade em geral. Use o InnoDB porque você precisa fazer transações e/ou deseja usar restrições de chave estrangeira (FK) para integridade de dados. Além disso, o InnoDB usa bloqueio em nível de linha, enquanto o MyISAM usa apenas bloqueio em nível de tabela. Portanto, o InnoDB pode lidar com níveis mais altos de simultaneidade melhor que o MyISAM. Use MyISAM para usar índices de texto completo e para um pouco menos de sobrecarga. Mais importante para a velocidade do que o tipo de mecanismo:coloque índices nas colunas que você precisa pesquisar rapidamente. Sempre coloque índices em suas colunas ID/PK, como o id_username que mencionei.
Mais detalhes:
Aqui está um monte de perguntas sobre tipos de dados MySQL e design de banco de dados (aviso, mais do que você pediu):
-
Qual DataType devo escolher?
-
Pergunta sobre design de tabela
-
Tipo de dados de enumeração versus tabela de dados no MySQL?
-
tipo de dados mysql para número de telefone e endereço
-
Melhor tipo de dados mysql para gramas, miligramas , microgramas e quilojoule
-
Tipo de dados de classificação de 5 estrelas do MySQL?
E algumas perguntas sobre quando usar o mecanismo InnoDB:
Eu apenas uso
tinyint
para quase tudo (sério). Editar - Como armazenar "postagens:"
Abaixo estão alguns links com mais detalhes, mas aqui está a versão curta. Para armazenar "posts", você precisa de espaço para uma string de texto longa.
CHAR
comprimento máximo é 255, então isso não é uma opção e, claro, CHAR
desperdiçaria caracteres não utilizados versus VARCHAR
, que é de comprimento variável CHAR
. Antes do MySQL 5.0.3,
VARCHAR
comprimento máximo era 255, então você ficaria com TEXT
. No entanto, em versões mais recentes do MySQL, você pode usar VARCHAR
ou TEXT
. A escolha se resume à preferência, mas há algumas diferenças. VARCHAR
e TEXT
max length agora é 65.535, mas você pode definir seu próprio max em VARCHAR
. Digamos que você acha que suas postagens precisarão ter no máximo 2000, você pode definir VARCHAR(2000)
. Se você atingir o limite, você pode ALTER
você tabela mais tarde e aumenta para VARCHAR(3000)
. Por outro lado, TEXT
realmente armazena seus dados em um BLOB
(1). Ouvi dizer que pode haver diferenças de desempenho entre VARCHAR
e TEXT
, mas não vi nenhuma prova, então você pode querer investigar mais, mas você sempre pode alterar esse pequeno detalhe no futuro. Mais importante, pesquisar esta coluna "post" usando um índice de texto completo em vez de
LIKE
seria muito mais rápido (2). No entanto, você precisa usar o mecanismo MyISAM para usar o índice de texto completo porque o InnoDB não o suporta . Em um banco de dados MySQL, você pode ter uma mistura heterogênea de mecanismos para cada tabela, então você só precisaria fazer sua tabela "posts" usar MyISAM. No entanto, se você realmente precisar de "posts" para usar o InnoDB (para transações), configure um gatilho para atualizar a cópia MyISAM de sua tabela "posts" e use a cópia MyISAM para todas as suas pesquisas de texto completo. Veja abaixo algumas citações úteis.
-
Gráfico de tipos de dados MySQL (desatualizado)
-
Tipos de dados MySQL (desatualizados)
-
Capítulo 10. Tipos de dados (mais detalhes)
-
Os tipos BLOB e TEXT (1)
-
11.9. Funções de pesquisa de texto completo (2)
-
10.4.1. Os tipos CHAR e VARCHAR (3)
Por último, aqui está um ótimo post sobre os prós e contras de VARCHAR versus TEXT. Ele também fala sobre o problema de desempenho: