O adaptador de MySQL do ActiveRecord ficou um pouco mais esperto na hora de criar ou alterar colunas no banco de dados usando inteiros. De acordo com a opção :limit, ele define se a coluna será um smallint, int ou bigint. Veja um trecho do código que faz isto:
case limit
when 0..3
"smallint()"
when 4..8
"int()"
when 9..20
"bigint()"
else
'int(11)'
end
O trecho acima foi extraído do arquivo activerecord/lib/active_record/connection_adapters/mysql_adapter.rb à partir da linha 470.
Para ficar mais claro, vamos mapear isto em um migration e ver que tipo de coluna será criado para cada caso:
create_table :table_name, :force => true do |t|
# de 0 à 3: smallint
t.integer :coluna1, :limit => 2 # smallint(2)
# de 4 à 8: int
t.integer :coluna2, :limit => 6 # int(6)
# de 9 à 20: bigint
t.integer :coluna3, :limit => 15 # bigint(15)
# se a opção :limit não for informada: int(11)
t.integer :coluna4 # int(11)
end
O adaptador do PostgreSQL já fazia assim, o do MySQL apenas seguiu a tendência.
13 Comentários em "Edge Rails: smallint, int ou bigint no MySQL?"
Bom saber! Já era hora do rails fazer isso. Economizar espaço em banco de dados é sempre bom.
Aproveitando, uma pergunta de “novo leitor do blog”: o que você usa pra fazer o syntax highlight?
@Thiago
Eu uso um bundle do TextMate que gera o css e o html necessário para ficar assim. No meu caso é só copiar do TM e colar no wordpress.
@Carlos
É…penso quando conseguirei comprar meu MacBook (ainda sou um pobre graduando a procura de estágio).
Agora tem uns macs mais “baratos”… vale muito a penas guardar um dinheirinho para isto… vale mesmo!
Se continuar se interessando por coisas novas como está agora, em breve vc terá não um estágio, mas um emprego legal! Aí vc compra um mac. hehe!
Muito legal isso, e seu blog é muito legal carlos, eu sempre ouvia falar mas nunca tinha entrado até semana passa que o adicionei meu RSS do IGoogle. Parabens.
Eu já estou de saco cheio de Rails no windows e definitivamente vou migrar para o MAC OS mas o complicado vai ser vender meu notebook para poder comprar o mac, mas se tiver jeito passa o link ai do bundle.
Abraços.
Acho que este bundle já vem com o TextMate, Daniel. Existe a opção “Create CSS From Current Theme” e “Create HTML From Selection”.
@daniel
Realmente, no windows é complicado…
Eu estou muito feliz com meu linux, e não trocaria por nada (pelo menos por enquanto). Mas um MacBook seria legal…
@carlos
Mas se ele cria o CSS eu posso copiar daqui, hehehe. Mas deve ter um plugin pra isso…acts_as_highlighted, hehe.
Opa, Bom ver que a integração rails/mysql está melhorando.. mass, ainda falta algumas coisas.. ( a parte de um campo ZEROFILL, tive que fazer um pequeno ‘artificio técnico’ pra poder fazer funcionar :D)
Abraços
Bem legal mesmo. Agora será que isso diminuiria o trafego de dados? Quando o active record pega as informações do mysql, provavelmente ele vai transformar todas essas variações de int em um objeto do tipo inteiro do Ruby certo? Então acredito que a tramitação dos dados no select seja menor.
Pequeno volume de informação não vai fazer diferença, agora imaginem querys “que fazem a diferença”.
Um abraço!
Glaucio,
Na verdade acredito que daria na mesma…
Continuando, na inserção dos dados que não faria diferença nenhuma, já que o Objeto do tipo inteiro terá o mesmo tamanho.
Estou certo?
Abraço
Mesmo em uma busca, acho que a diferença seria minima, se houver. Acredito que talvez o que possa melhorar, e isto depende muito da quantidade de informação no banco, é o consumo de espaço em disco. Mas mesmo assim ainda acho que seria muito pouco.
Bom, não sou um especialista em banco de dados… se mais alguém tiver alguma informação…
É mais a nível de curiosidade mesmo. Talvez não tenha muita diferença realmente.
Um abraço!
Deixe o seu comentário!