AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 50652
Accepted
Lawtonfogle
Lawtonfogle
Asked: 2013-09-28 05:40:34 +0800 CST2013-09-28 05:40:34 +0800 CST 2013-09-28 05:40:34 +0800 CST

Compartilhando uma única sequência de chave primária em um banco de dados?

  • 772

É uma prática aceitável usar uma única sequência como chave primária em todas as tabelas (em vez de uma chave primária ser exclusiva para uma determinada tabela, ela é exclusiva para todas as tabelas)? Em caso afirmativo, é objetivamente melhor do que usar uma única sequência de chave primária nas tabelas.

Sou um desenvolvedor de software júnior, não um DBA, então ainda estou aprendendo muitos dos fundamentos de um bom projeto de banco de dados.

Editar: caso alguém esteja se perguntando, li recentemente uma crítica de um design de banco de dados por um dos DBAs de nossa empresa, que mencionou que era um problema que o design não usasse uma única chave primária em todo o banco de dados, o que parecia diferente do que Eu aprendi até agora.

Edit2: Para responder a uma pergunta nos comentários, isso é para Oracle 11g, mas eu estava pensando em um nível não específico de banco de dados. Se esta questão dependesse do banco de dados, eu estaria interessado em saber o porquê, mas nesse caso eu estaria procurando uma resposta específica para o Oracle.

database-design primary-key
  • 5 5 respostas
  • 14660 Views

5 respostas

  • Voted
  1. Best Answer
    Aaron Bertrand
    2013-09-28T07:13:52+08:002013-09-28T07:13:52+08:00

    Aceitável? Claro. Comum? Não. Benéfico? Duvidoso.

    No meu antigo emprego, herdamos um sistema onde eles tinham um gerador de sequência central (este era um sistema SQL Server muito antes de SEQUENCEser introduzido no SQL Server 2012). Não foi realmente um gargalo de desempenho e não deveria ser, a menos que você esteja gerando centenas de milhares de valores por segundo. Mas tornou todo o código muito mais complexo do que deveria ser, sem um bom motivo. A intenção do projeto era ter certeza de que, se algo no sistema recebesse um valor de ID de 12, apenas uma coisa no sistema poderia ter o ID 12. Isso parecia bastante obtuso para mim e nunca entendi. Se eu tiver um cliente com CustomerID = 12, por que isso me impede de ter um pedido com OrderID = 12?

    Eu vejo a utilidade de um gerador de sequência central se você tiver vários sistemas e estiver gerando IDs para um determinado tipo de entidade (digamos, um cliente ou um pedido) desses vários sistemas. Uma sequência central pode distribuir novos valores para vários sistemas sem ser um gargalo (apenas um único ponto de falha) e sem medo de dois sistemas gerarem o mesmo ID.

    • 13
  2. RayG
    2013-09-28T09:25:02+08:002013-09-28T09:25:02+08:00

    A ideia tem mérito em um banco de dados muito complexo, onde as pessoas podem ingressar acidentalmente em uma tabela usando a coluna errada e obter linhas inválidas apenas porque os IDs INT são os mesmos.

    Escolhemos ter GUIDs sequenciais como nossas chaves primárias para evitar algumas das armadilhas de fragmentação de índice dos GUIDs. Infelizmente eles são bem grandes.

    O servidor SQL pode gerar GUIDs sequenciais por meio de um padrão invocando a função newSequentialID(), portanto, não há tabela de chaves emitidas para manter e nenhum gargalo de bloqueio.

    Isso nos deu IDs exclusivos em todos os bancos de dados, em toda a nossa empresa, na verdade, pois são verdadeiramente únicos.

    O preço, é claro, é o espaço e é problemático quando você tenta trazer os dados para um Data Warehouse/Cubo, onde a velocidade/tamanho é baseada no uso de chaves inteiras menores.

    Estou convencido de que evitamos muitos bugs em nosso aplicativo como resultado de usá-los.

    • 7
  3. mustaccio
    2013-09-28T06:02:54+08:002013-09-28T06:02:54+08:00

    Não consigo imaginar qual pode ser a razão por trás da sequência única em todas as tabelas. Tudo o que faz é criar um gargalo ao gerar novos valores.

    Não importa quão pequena seja a sobrecarga de geração de valores de chave sequencial, o gerador é um único recurso, cujo acesso deve ser sincronizado. Quanto mais solicitações ele receber, maiores serão as chances de alguns solicitantes terem que esperar sua vez de tocar. É óbvio que o gerador de sequência única compartilhado entre todas as tabelas será acessado com mais frequência por mais clientes, produzindo assim mais contenção do que qualquer um dos vários geradores. A contenção pode se tornar mais pronunciada se as regras de negócios imporem restrições aos valores gerados, como a ausência de lacunas ou ordenação estrita ou em um banco de dados em cluster.

    Mesmo com o gerador de sequência mais eficiente, haverá uma carga de trabalho que causa contenção intolerável.

    • 4
  4. Anup Shah
    2013-09-28T07:59:21+08:002013-09-28T07:59:21+08:00

    o objetivo da chave primária nas tabelas do banco de dados é principalmente impor a exclusividade dos dados que deveriam ser exclusivos, porque todos os fluxos de trabalho não podem ser cobertos e garantidos que não resultarão em duplicação de dados. A segunda razão é que, muitas vezes, PK também é candidato primário para índice clusterizado na tabela, portanto, também aumenta a recuperação de dados quando/onde essas colunas são usadas corretamente na consulta selecionada.

    usar um número de sequência como chave primária é o mesmo que toda tabela tem coluna de identidade e apenas essa coluna está sendo usada em PrimaryKey. ter um único número de sequência no banco de dados deve ter algum uso específico, mas do ponto de vista da chave primária, não entendo o motivo. por exemplo, em um dos projetos de Datawarehouse em que trabalhei, temos uma coluna chamada LoadBatchID e do ETL para relatar 50% de toda a tabela tem essa coluna, mas em alguns lugares ela tem um significado diferente. usamos o proc exclusivo como gerador de números para garantir que não encontramos conflitos e também nos ajuda a rastrear o arquivo original de onde vieram os dados e o que acontece em cada estágio diferente do ETL.

    • 2
  5. Neil McGuigan
    2013-09-28T18:09:27+08:002013-09-28T18:09:27+08:00

    Suponho que uma razão para fazer isso seria se todas as entidades fossem herdadas de alguma entidade pai. Digamos, por exemplo, que você queira colocar um comentário em qualquer tipo de entidade:

    create table god_entity (
      id bigserial primary key
    );
    
    create table some_table (
      id bigint primary key references god_entity(id),
      ...
    );
    
    create table some_other_table (
      id bigint primary key references god_entity(id),
      ...
    );
    
    create table comment (
      id bigint primary key references god_entity(id),
      ...
    );
    
    create table entity_comment (
      entity_id bigint not null references god_entity(id),
      comment_id bigint not null references god_entity(id),
    
      primary key (entity_id, comment_id)
    );
    

    Normalmente isso não é feito. .

    Não sei sobre as características de desempenho.

    • 2

relate perguntas

  • Quais são as desvantagens de usar UUID ou GUID como chave primária?

  • É melhor armazenar os valores calculados ou recalculá-los a pedido? [duplicado]

  • Armazenar vs calcular valores agregados

  • Chaves primárias de caractere x número inteiro

  • Quais são algumas maneiras de implementar um relacionamento muitos-para-muitos em um data warehouse?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve