Do not speak Portuguese? Translate this site with Google or Bing Translator
Quando é recomendado o uso de chave primária composta?

Posted on: March 05, 2024 11:24 AM

Posted by: Renato

Views: 282

Quando é recomendado o uso de chave primária composta?

Uma chave simples é associada a um único valor, ou campo, do registro. Uma chave composta corresponde à combinação de duas ou mais chaves, e pode ser necessária para eliminar a ambiguidade, formando um identificador único. (Wikipedia)

Vamos supor, apenas como exemplo, que eu vá implementar um blog com o uso de chave primária simples. Os registros ficariam assim:

Tabela posts:
| id |     post     |
-------------------
|  1 | "Um post"    |
|  2 | "Outro post" |

Tabela comentarios:
| id | post_id |    comentario    |
---------------------------------
|  1 |       1 | "Meu comentário" |
|  2 |       1 | "Meu comentário" |
|  3 |       1 | "Meu comentário" |
|  4 |       2 | "Meu comentário" |
|  5 |       2 | "Meu comentário" |
|  6 |       2 | "Meu comentário" |

Ou seja: os comentários teriam chaves primárias (coluna id) únicas em relação a todos os comentários, mesmo de outros posts.

Se eu usasse chave primária composta os comentários teriam id's únicos apenas com relação ao seu post (coluna post_id):

Tabela comentarios:
| post_id | id |    comentario    |
---------------------------------
|       1 |  1 | "Meu comentário" |
|       1 |  2 | "Meu comentário" |
|       1 |  3 | "Meu comentário" |
|       2 |  1 | "Meu comentário" |
|       2 |  2 | "Meu comentário" |
|       2 |  3 | "Meu comentário" |

O mesmo princípio vale para outras situações, como uma nota fiscal e seus itens, por exemplo.

Em que situações é recomendado o uso da chave primária composta? E quando é melhor usar chave primária simples?

No seu caso acredito que seu campo comentário deve ter seu próprio id e deve ter o o post_id sendo usado como chave estrangeira, assim como no caso das notas fiscais, já que nesses casos você está falando de um relacionamento 1xN (um comentário pertence a um, e apenas um post, já o post possui 0 ou muitos comentários).

O uso de chave primária composta pode ser feito quando você possui dois campos que juntos sempre serão únicos para aquela tabela, por exemplo:

Em um determinado aeroporto saem voos todos os dias, o número dos voos é sempre o mesmo para um determinado horário e um determinado destino, por exemplo, o voo com destino a Guarulhos no horário das 20:00 é de numero 1212. Independente do dia, o voo 1212 sempre será com o destino a Guarulhos e sempre no horário das 20:00, logo você não pode usar voo como chave primária, nem mesmo data, pois em um mesmo dia saem inúmeros voos. Nesse caso você poderia usar os campos voo e data como chaves primárias, pois eles juntos são únicos, já que nunca terá o mesmo voo duas vezes em um mesmo dia.

| voo  |    data    | outros campos...
--------------------------------------
| 1212 | 14/05/2014 |
| 1234 | 14/05/2014 | 
| 2345 | 14/05/2014 | 
| 1212 | 15/05/2014 |
| 1234 | 15/05/2014 | 
| 2345 | 15/05/2014 | 

Você também poderia atribuir um id para cada registro e usar uma única chave primária, entretanto isso depende da sua modelagem.

Transcrevendo tudo que foi dito nos comentários:
Me arrisco a dizer que para todos os casos que a situação se assemelhe com a tabela fictícia de voos, você poderá optar tanto por usar duas colunas como chave primária composta ou por criar um id e ter uma chave primária simples.

Diferenças:

  • Optando por usar duas colunas como chave primária você economiza um campo na sua tabela, e também você já está adicionando uma constraint a sua tabela garantindo a consistência dos dados. A desvantagem nesse caso é ter que usar dois campos em toda operação que você fizer que necessita pegar um único registro, como select, update, delete, etc. Outra desvantagem é que para cada tabela relacional que você fizer, terá um campo a mais, logo a primeira vantagem que eu citei acaba não compensando essa desvantagem, já que uma tabela relacional costuma ter muito mais registros do que as tabelas que ela relaciona.

  • Optando por usar o id, fica mais fácil fazer os relacionamentos com outras tabelas, pois você usará apenas um campo sempre. A desvantagem é que você terá um campo a mais em sua tabela. Outro ponto que não é desvantagem nem vantagem é que você terá que colocar os constraints a parte, indicando quais campos são únicos, vale lembrar que é possível dizer que dois campos juntos são únicos, similar a uma chave primária composta.

Na maioria dos casos, as vantagens e desvantagens de cada são quase desconsideráveis, portanto escolha a opção que você ficar mais a vontade.

Só consegui imaginar um caso em que uma opção seria melhor do que a outra, seria se seu modelo tiver muitos relacionamentos NxN, pois a quantidade de campos aumentaria de uma forma considerável, mais ainda se ao invés de dois campos você tiver inúmeros campos como chave primária, para cada tabela você possuirá uma quantidade muito superior de campos e dados.

Respondendo a dúvida inicial em usar ou não usar PK composta. Por experiência eu aprendi levando porrada que não é bom utilizar chave composta.

Podemos citar como exemplo para utilizar PK única:

  • Banco de dados que tenham campos identity (auto sequencial) é mais fácil de utulizar
  • Fazer update / delete no where é mais fácil e rápido (imagina você ter que usar 10 campos no where
  • Mais fácil visualizar em outras tabelas
  • inner join e left join são mais fácil e rápido de fazer

O único motivo para uma chave composta seria numa tabela N:N, porém neste casos, prefiro fazer uma PK única, e o constrain para validar os outros campos.

Chave composta deve ser usada se e somente se você quiser garantir a integridade referencial no seu banco de dados de que nunca existirá uma combinação igual destas chaves para um registro na mesma tabela.

Eu confesso que posso garantir essa integridande utilizando indices compostos únicos e nunca precisei recorrer às PK compostas. Pois no fim isso adiciona complexidade na hora de consultar e um manipular um registro.

Outro ponto que pode ser levado em conta aqui é a indexação mais rápida se voce quiser por exemplo economizar joins utilizando uma consulta em uma das chaves ou indices compostos mas isso poderia ser feito com FKs assim como PKs compostas.

Sinceramente, eu recomendo nunca utilizar.

Espero ter ajudado.

Fonte:

https://pt.stackoverflow.com/questions/15883/quando-%c3%a9-recomendado-o-uso-de-chave-prim%c3%a1ria-composta


1

Share

Donate to Site


About Author

Renato

Developer

Add a Comment

Blog Search


Categories

OUTROS (16) Variados (109) PHP (133) Laravel (171) Black Hat (3) front-end (29) linux (114) postgresql (39) Docker (28) rest (5) soap (1) webservice (6) October (1) CMS (2) node (7) backend (13) ubuntu (56) devops (25) nodejs (5) npm (3) nvm (1) git (8) firefox (1) react (7) reactnative (5) collections (1) javascript (7) reactjs (8) yarn (0) adb (1) Solid (2) blade (3) models (1) controllers (0) log (1) html (2) hardware (3) aws (14) Transcribe (2) transcription (1) google (4) ibm (1) nuance (1) PHP Swoole (5) mysql (31) macox (4) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (3) imagick (2) ec2 (1) sw (1) websocket (2) markdown (1) ckeditor (1) tecnologia (14) faceapp (1) eloquent (14) query (4) sql (40) ddd (3) nginx (9) apache (4) certbot (1) lets-encrypt (3) debian (12) liquid (1) magento (2) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (2) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (4) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (2) binaural (1) mysqli (3) database (42) windows (6) vala (1) json (2) oracle (1) mariadb (4) dev (12) webdev (24) s3 (4) storage (1) kitematic (1) gnome (2) web (2) intel (3) piada (1) cron (2) dba (18) lumen (1) ffmpeg (2) android (2) aplicativo (1) fedora (2) shell (4) bash (3) script (3) lider (1) htm (1) csv (1) dropbox (1) db (3) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (1) biologia (1) programming (22) performance (3) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (3) microg (1) iode (1) ssh (3) zsh (2) terminal (3) dracula (1) spaceship (1) mac (2) idiomas (1) laptop (2) developer (37) api (5) data (1) matematica (1) seguranca (2) 100DaysOfCode (9) hotfix (1) documentation (1) laravelphp (10) RabbitMQ (3) Elasticsearch (1) redis (2) Raspberry (4) Padrao de design (4) JQuery (1) angularjs (4) Dicas (43) Kubernetes (3) vscode (2) backup (1) angular (3) servers (2) pipelines (1) AppSec (1) DevSecOps (4) rust (1) RustLang (1) Mozilla (1) algoritimo (1) sqlite (1) Passport (2) jwt (5) security (2) translate (1) kube (2) iot (1) politica (2) bolsonaro (1) flow (1) podcast (1) Brasil (1) containers (3) traefik (1) networking (1) host (1) POO (2) microservices (2) bug (1) cqrs (1) arquitetura (3) Architecture (4) sail (3) militar (1) artigo (1) economia (1) forcas armadas (1) ffaa (1) autenticacao (2) autorizacao (2) authentication (4) authorization (3) NoCookies (1) wsl (4) memcached (1) macos (2) unix (2) kali-linux (1) linux-tools (5) apple (1) noticias (2) composer (1) rancher (1) k8s (1) escopos (1) orm (1) jenkins (4) github (5) gitlab (3) queue (1) Passwordless (1) sonarqube (1) phpswoole (1) laraveloctane (1) Swoole (1) Swoole (1) octane (1) Structurizr (1) Diagramas (1) c4 (1) c4-models (1) compactar (1) compression (1) messaging (1) restfull (1) eventdrive (1) services (1) http (1) Monolith (1) microservice (1) historia (1) educacao (1) cavalotroia (1) OOD (0) odd (1) chatgpt (1) openai (3) vicuna (1) llama (1) gpt (1) transformers (1) pytorch (1) tensorflow (1) akitando (1) ia (1) nvidia (1) agi (1) guard (1) multiple_authen (2) rpi (1) auth (1) auth (1) livros (2) ElonMusk (2) Oh My Zsh (1) Manjaro (1) BigLinux (2) ArchLinux (1) Migration (1) Error (1) Monitor (1) Filament (1) LaravelFilament (1) replication (1) phpfpm (1) cache (1) vpn (1) l2tp (1) zorin-os (1) optimization (1) scheduling (1) monitoring (2) linkedin (1) community (1) inteligencia-artificial (2) wsl2 (1) maps (1) API_KEY_GOOGLE_MAPS (1) repmgr (1) altadisponibilidade (1) banco (1) modelagemdedados (1) inteligenciadedados (4) governancadedados (1) bancodedados (2) Observability (1) picpay (1) ecommerce (1) Curisidades (1) Samurai (1) KubeCon (1) GitOps (1) Axios (1) Fetch (1) Deepin (1) vue (4) nuxt (1) PKCE (1) Oauth2 (2) webhook (1) TypeScript (1) tailwind (1) gource (2)

New Articles



Get Latest Updates by Email