No trabalho, temos um grande banco de dados com índices exclusivos em vez de chaves primárias e tudo funciona bem.
Estou criando um novo banco de dados para um novo projeto e tenho um dilema:
Na teoria do banco de dados, a chave primária é o elemento fundamental, tudo bem, mas nos projetos REAL, quais são as vantagens e desvantagens de ambos?
O que você usa nos projetos?
EDIT: ... e o que dizer de chaves primárias e replicação no servidor MS SQL?
sql
database
database-design
Cicik
fonte
fonte
Respostas:
O que é um índice exclusivo?
Um índice exclusivo em uma coluna é um índice nessa coluna que também impõe a restrição de que você não pode ter dois valores iguais nessa coluna em duas linhas diferentes. Exemplo:
A última inserção falha porque viola o índice exclusivo na coluna
foo
quando tenta inserir o valor 1 nessa coluna pela segunda vez.No MySQL, uma restrição exclusiva permite vários NULLs.
É possível criar um índice exclusivo em colunas múltiplas.
Chave primária versus índice exclusivo
Coisas iguais:
Coisas diferentes:
fonte
Você pode vê-lo assim:
Uma chave primária é única
Um valor exclusivo não precisa ser a representação do elemento
Significado?; Bem, uma chave primária é usada para identificar o elemento, se você tem uma "Pessoa", você gostaria de ter um Número de Identificação Pessoal (SSN ou similar) que seja Primário para sua Pessoa.
Por outro lado, a pessoa pode ter um e-mail exclusivo, mas não a identifica.
Eu sempre tenho Chaves Primárias, mesmo em tabelas de relacionamento (a tabela intermediária / de conexão) eu posso tê-las. Por quê? Bem, eu gosto de seguir um padrão ao codificar, se a "Pessoa" tiver um identificador, o Carro tiver um identificador, bem, a Pessoa -> Carro também deverá ter um identificador!
fonte
Chaves estrangeiras funcionam com restrições exclusivas e chaves primárias. Dos Livros Online:
Para replicação transacional, você precisa da chave primária. Dos Livros Online:
Ambas as respostas são para o SQL Server 2005.
fonte
A escolha de quando usar uma chave primária substituta em oposição a uma chave natural é complicada. Respostas como, sempre ou nunca, raramente são úteis. Acho que depende da situação.
Como exemplo, eu tenho as seguintes tabelas:
Temos duas tabelas de entidades (
toll_booths
ecars
) e uma tabela de transações (drive_through
). Atoll_booth
tabela usa uma chave substituta porque não possui nenhum atributo natural que não garante a alteração (o nome pode ser alterado facilmente). Acars
tabela usa uma chave primária natural porque possui um identificador exclusivo (vin
) que não muda . Adrive_through
tabela de transações usa uma chave substituta para facilitar a identificação, mas também possui uma restrição exclusiva nos atributos que são garantidos como exclusivos no momento em que o registro é inserido.http://database-programmer.blogspot.com tem ótimos artigos sobre esse assunto em particular.
fonte
Não há desvantagens de chaves primárias.
Para adicionar apenas algumas informações às respostas @MrWiggles e @Peter Parker, quando a tabela não tiver chave primária, por exemplo, você não poderá editar dados em alguns aplicativos (eles acabarão dizendo que sth como não pode editar / excluir dados sem chave primária). O Postgresql permite que vários valores NULL estejam na coluna UNIQUE, PRIMARY KEY não permite NULLs. Além disso, alguns ORM que geram código podem ter alguns problemas com tabelas sem chaves primárias.
ATUALIZAR:
Tanto quanto sei, não é possível replicar tabelas sem chaves primárias no MSSQL, pelo menos sem problemas ( detalhes ).
fonte
Se algo for uma chave primária, dependendo do mecanismo do banco de dados, a tabela inteira será classificada pela chave primária. Isso significa que as pesquisas são muito mais rápidas na chave primária porque ela não precisa fazer nenhuma referência diferente, como acontece com qualquer outro tipo de índice. Além disso, é apenas teoria.
fonte
Além do que as outras respostas disseram, alguns bancos de dados e sistemas podem exigir a presença de um primário. Uma situação vem à mente; ao usar a replicação corporativa com o Informix, uma PK deve estar presente para que uma tabela participe da replicação.
fonte
Contanto que você não permita NULL para um valor, eles devem ser tratados da mesma forma, mas o valor NULL é tratado de maneira diferente nos bancos de dados (o AFAIK MS-SQL não permite mais de um (1) valor NULL, o mySQL e o Oracle permitem isso , se uma coluna for ÚNICA) Portanto, você deve definir esta coluna NÃO NÚMERO ÍNDICE ÚNICO
fonte
Não existe uma chave primária na teoria dos dados relacionais; portanto, sua pergunta deve ser respondida no nível prático.
Índices exclusivos não fazem parte do padrão SQL. A implementação específica de um DBMS determinará quais são as conseqüências da declaração de um índice exclusivo.
No Oracle, declarar uma chave primária resultará na criação de um índice exclusivo em seu nome, portanto a questão é quase discutível. Não posso falar sobre outros produtos DBMS.
Eu sou a favor de declarar uma chave primária. Isso tem o efeito de proibir NULLs na (s) coluna (s) chave (s), além de proibir duplicatas. Também sou a favor de declarar restrições de REFERENCES para reforçar a integridade da entidade. Em muitos casos, declarar um índice no (s) coulmn (s) de uma chave estrangeira acelerará as junções. Esse tipo de índice geralmente não deve ser único.
fonte
Existem algumas desvantagens de ÍNDICES CLUSTERED vs ÍNDICES ÚNICOS.
Como já foi dito, um ÍNDICE CLUSTERED solicita fisicamente os dados na tabela.
Isso significa que quando você tem muito se inserir ou excluir uma tabela que contém um índice em cluster, toda vez (bem, quase, dependendo do fator de preenchimento) você altera os dados, a tabela física precisa ser atualizada para permanecer classificada.
Em tabelas relativamente pequenas, isso é bom, mas ao acessar tabelas com dados em GB e inserções / exclusões afetam a classificação, você terá problemas.
fonte
Quase nunca crio uma tabela sem uma chave primária numérica. Se também houver uma chave natural que deva ser única, também coloquei um índice exclusivo. As junções são mais rápidas em números inteiros do que as chaves naturais de várias colunas; os dados precisam apenas ser alterados em um único local (as chaves naturais tendem a precisar ser atualizadas, o que é uma coisa ruim quando se trata de relacionamentos de chave primária - chave estrangeira). Se você precisar de replicação, use um GUID em vez de um número inteiro, mas na maioria das vezes prefiro uma chave legível pelo usuário, especialmente se eles precisarem vê-la para distinguir entre John Smith e John Smith.
As poucas vezes em que não crio uma chave substituta são quando tenho uma tabela de junção envolvida em um relacionamento de muitos para muitos. Nesse caso, declaro os dois campos como a chave primária.
fonte
Meu entendimento é que uma chave primária e um índice exclusivo com uma restrição não nula, são os mesmos (*); e suponho que um escolha um ou outro, dependendo do que a especificação declara ou implica explicitamente (uma questão do que você deseja expressar e aplicar explicitamente). Se exigir exclusividade e não nulo, torne-a uma chave primária. Se acontecer que todas as partes de um índice exclusivo não são nulas sem nenhum requisito para isso, basta torná-lo um índice exclusivo.
A única diferença restante é que você pode ter vários índices exclusivos não nulos, enquanto não pode ter várias chaves primárias.
(*) Exceto uma diferença prática: uma chave primária pode ser a chave exclusiva padrão para algumas operações, como definir uma chave estrangeira. Ex. se alguém definir uma chave estrangeira referenciando uma tabela e não fornecer o nome da coluna, se a tabela referenciada tiver uma chave primária, a chave primária será a coluna referenciada. Caso contrário, a coluna referenciada deverá ser nomeada explicitamente.
Outros aqui mencionaram a replicação de banco de dados, mas eu não sei sobre isso.
fonte
Índice exclusivo pode ter um valor NULL. Ele cria ÍNDICE NÃO CLUSTERED. Chave primária não pode conter valor NULL. Cria ÍNDICE CLUSTERED.
fonte
No MSSQL, as chaves primárias devem aumentar monotonicamente para obter o melhor desempenho no índice em cluster. Portanto, um número inteiro com inserção de identidade é melhor do que qualquer chave natural que pode não estar aumentando monotonicamente.
fonte
Se fosse por mim...
Você precisa atender aos requisitos do banco de dados e de seus aplicativos.
A adição de uma coluna de ID inteiro ou longo com incremento automático a todas as tabelas para servir como chave primária cuida dos requisitos do banco de dados.
Você adicionaria pelo menos um outro índice exclusivo à tabela para uso do seu aplicativo. Esse seria o índice em employee_id, ou account_id, ou customer_id, etc. Se possível, esse índice não deve ser um índice composto.
Eu preferiria índices em vários campos individualmente sobre índices compostos. O banco de dados usará os índices de campo único sempre que a cláusula where incluir esses campos, mas somente usará um composto quando você fornecer os campos exatamente na ordem correta - o que significa que não poderá usar o segundo campo em um índice composto, a menos que você forneça o primeiro e o segundo na sua cláusula where.
Sou a favor do uso de índices calculados ou do tipo Função - e recomendo usá-los sobre índices compostos. Isso facilita muito o uso do índice de função, usando a mesma função na sua cláusula where.
Isso cuida dos requisitos de sua aplicação.
É altamente provável que outros índices não primários sejam realmente mapeamentos desse valor de chave de índices para um valor de chave primária, não para rowid (). Isso permite que operações de classificação física e exclusões ocorram sem a necessidade de recriar esses índices.
fonte