Chave Primária Excedendo Long

9 respostas
Sandro_Queiroz

Olá pessoal,

Estou desenvolvendo um sistema que tem algumas tabelas cuja chave primária é auto gerada.
O problema é que começo a achar que o valor máximo do tipo Long (9.223.372.036.854.775.807) não será suficiente.
Não sei bem que tipo de dado devo usar em casos como este. Pensei em usar o BigInteger.
Então é isso. Qual tipo de dado vocês usam pra campos numéricos inteiros que podem excededor o valor máximo do Long?

Desde já agradeço.

9 Respostas

B

Mesmo que cada objeto indexado no teu sistema tivesse 1 byte de tamanho, você precisaria de 8 exabytes em storage para guardar tudo isso, e duvido que estejas fazendo um sistema para aceleradores de partículas ou radiotelescópios.

Mesmo que você gravasse 1000 registros por segundo, levaria 18 bilhões de anos para alcançar esse limite.

Tem mesmo certeza que um Long não será suficiente? :wink:

Isso ou gerador de chaves está muito bugado.

fabiofalci

http://stackoverflow.com/questions/45399/advantages-and-disadvantages-of-guid-uuid-database-keys

Sandro_Queiroz

Olá Bruno Laturner,

Bom, se eu gravasse 1.000 registros a cada segundo na realidade daria para um pouco mais de 292 milhões de anos e não 18 bilhões de anos. :slight_smile:
Ou seja, bem menos do que você calculou. :stuck_out_tongue:
Mas, brincadeiras à parte. Eu entendi a sua colocação. Realmente eu tava viajando muito. Long é muito mais do que suficiente para mim.
Aproveitando o tópico, só queria levantar mais duas questões.
Quanto à precisão dos valores, o Long tem o mesmo problema do Double em operações matemáticas?
Eu teria algum benefício em usar BigInteger no lugar de Long nas minhas Entities?

Olá fabiofalci,

Não tive tempo ainda de ler direito, mas agradeço a sua colaboração.

dtxk

Sandro Queiroz:
Olá Bruno Laturner,

Bom, se eu gravasse 1.000 registros a cada segundo na realidade daria para um pouco mais de 292 milhões de anos e não 18 bilhões de anos. :slight_smile:
Ou seja, bem menos do que você calculou. :stuck_out_tongue:
Mas, brincadeiras à parte. Eu entendi a sua colocação. Realmente eu tava viajando muito. Long é muito mais do que suficiente para mim.
Aproveitando o tópico, só queria levantar mais duas questões.
Quanto à precisão dos valores, o Long tem o mesmo problema do Double em operações matemáticas?
Eu teria algum benefício em usar BigInteger no lugar de Long nas minhas Entities?

Olá fabiofalci,

Não tive tempo ainda de ler direito, mas agradeço a sua colaboração.

Porque vc não usa BigDecimal?

maior_abandonado

Sandro Queiroz:
Olá Bruno Laturner,

Bom, se eu gravasse 1.000 registros a cada segundo na realidade daria para um pouco mais de 292 milhões de anos e não 18 bilhões de anos. :slight_smile:
Ou seja, bem menos do que você calculou. :stuck_out_tongue:
Mas, brincadeiras à parte. Eu entendi a sua colocação. Realmente eu tava viajando muito. Long é muito mais do que suficiente para mim.
Aproveitando o tópico, só queria levantar mais duas questões.
Quanto à precisão dos valores, o Long tem o mesmo problema do Double em operações matemáticas?
Eu teria algum benefício em usar BigInteger no lugar de Long nas minhas Entities?

Olá fabiofalci,

Não tive tempo ainda de ler direito, mas agradeço a sua colaboração.

O problema em questão se bem me lembro é só para calculos onde arredonda errado a parte fracionária, sendo assim acredito que você não terá este tipo de problemas com Long, não tendo então nenhuma vantagem em usar o BigInteger (a vantagem dele seria o tamanho mas como o tamanho parece ser mais que o suficiente para você…).

dtxk:
Sandro Queiroz:
Olá Bruno Laturner,

Bom, se eu gravasse 1.000 registros a cada segundo na realidade daria para um pouco mais de 292 milhões de anos e não 18 bilhões de anos. :slight_smile:
Ou seja, bem menos do que você calculou. :stuck_out_tongue:
Mas, brincadeiras à parte. Eu entendi a sua colocação. Realmente eu tava viajando muito. Long é muito mais do que suficiente para mim.
Aproveitando o tópico, só queria levantar mais duas questões.
Quanto à precisão dos valores, o Long tem o mesmo problema do Double em operações matemáticas?
Eu teria algum benefício em usar BigInteger no lugar de Long nas minhas Entities?

Olá fabiofalci,

Não tive tempo ainda de ler direito, mas agradeço a sua colaboração.

Porque vc não usa BigDecimal?

não vejo motivo para BigDecimal, uma vez que este representa números com parte fracionária e a chave primária é um número inteiro com incremento 1.

S

fabiofalci,

valeu pelo link! Bem interessante os pontos positivos e negativos.

Sandro_Queiroz

dtxk,

Não uso o BigDecimal exatamente pelo que o maior_abandonado explicou.

maior_abandonado,
Eu tava pensando em usar o BigInteger no lugar do Long pois quando o Hibernate cria as tabelas no Postgres, os atributos do tipo Long ele gera colunas do tipo BigInt.
E quando faço uma query nativa ele retorna o dado como BigInteger, então tenho que usar o método longValue() pois no bean o atributo é do tipo Long.
Alguma sugestão?

maior_abandonado

Sandro Queiroz:
dtxk,

Não uso o BigDecimal exatamente pelo que o maior_abandonado explicou.

maior_abandonado,
Eu tava pensando em usar o BigInteger no lugar do Long pois quando o Hibernate cria as tabelas no Postgres, os atributos do tipo Long ele gera colunas do tipo BigInt.
E quando faço uma query nativa ele retorna o dado como BigInteger, então tenho que usar o método longValue() pois no bean o atributo é do tipo Long.
Alguma sugestão?

no momento estou trabalhando em um sistema usando o oracle como base de dados e o hibernate tools (ferramenta dentro do jboss tools, plugin do eclipse) está gerando para mim BigDecimal em campos number, mesmo com a parte fracionaria 0… Pessoalmente acho isso uma merda mas como o sistema já foi começado desse jeito continuo ainda desse jeito. Se você estiver no começo (ou se quiser trabalhar da forma “na minha opinião” mais adequada, mesmo sendo esta diferente de como está o resto do sistema), aconselho você a alterar de BigInteger para Long ou Integer, que é o mais indicado para a maioria dos casos.

dtxk

Sandro Queiroz:
dtxk,

Não uso o BigDecimal exatamente pelo que o maior_abandonado explicou.

maior_abandonado,
Eu tava pensando em usar o BigInteger no lugar do Long pois quando o Hibernate cria as tabelas no Postgres, os atributos do tipo Long ele gera colunas do tipo BigInt.
E quando faço uma query nativa ele retorna o dado como BigInteger, então tenho que usar o método longValue() pois no bean o atributo é do tipo Long.
Alguma sugestão?

mals viajei… Usa o BigInteger.

Criado 2 de setembro de 2011
Ultima resposta 2 de set. de 2011
Respostas 9
Participantes 6