Do not speak Portuguese? Translate this site with Google or Bing Translator
RELACIONAMENTO 1 PARA 1 NO POSTGRESQL PARA REAL

Posted on: January 07, 2021 03:54 PM

Posted by: Renato

Categories: postgresql sql

Views: 2146

Antes o truque simples e óbvio:

1

2

3

4

5

6

7

8

9

10

11

12

CREATE TABLE UserProfiles (

        UProfileID BIGSERIAL PRIMARY KEY,

...

);

 

CREATE TABLE Users (

        UID BIGSERIAL PRIMARY KEY,

        UProfileID int8 NOT NULL,

...

        UNIQUE(UProfileID),

        FOREIGN KEY(UProfileID) REFERENCES Users(UProfileID)

);

Você coloca uma restrição única em uma coluna referenciada e está tudo bem. Mas então um dos leitores percebeu que esta é a relação 1-para- (0..1), não uma verdadeira relação 1-para-1. E ele estava absolutamente correto.

Truque muito mais simples usando recursos modernos ou PostgreSQL.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

BEGIN;

 

CREATE TABLE uProfiles (

        uid int8 PRIMARY KEY,

        payload jsonb NOT NULL

);

 

CREATE TABLE Users (

        uid int8 PRIMARY KEY,

        uname text NOT NULL,

        FOREIGN KEY (uid) REFERENCES uProfiles (uid)

);

 

ALTER TABLE uProfiles

    ADD FOREIGN KEY (uid) REFERENCES Users (uid);

 

INSERT INTO Users VALUES (1, 'Renato Lucena');

 

INSERT INTO uProfiles VALUES (1, '{}');

 

COMMIT;

...

Criamos duas tabelas e referenciamos uma à outra usando as mesmas colunas em ambas as maneiras. Além disso, nesse modelo ambas as nossas chaves estrangeiras são indexadas automaticamente!

Parece legítimo, mas a execução deste script produzirá o erro:

SQL Error [23503]: ERROR: insert or update on table "users" 
   violates foreign key constraint "users_uid_fkey"
Detail: Key (uid)=(1) is not present in table "uprofiles".

E essa era a armadilha que impedia as soluções fáceis anos atrás.

 

Mas agora temos restrições DEFERRABLE:

Isso controla se a restrição pode ser adiada. Uma restrição que não pode ser adiada será verificada imediatamente após cada comando. A verificação das restrições que são adiadas pode ser adiada até o final da transação (usando o comando SET CONSTRAINTS). NÃO DEFERRABLE é o padrão. Atualmente, apenas as restrições UNIQUE, PRIMARY KEY, EXCLUDE e REFERENCES (chave estrangeira) aceitam esta cláusula | (foreign key) constraints accept this clause.. As restrições NOT NULL e CHECK não são postergáveis. Observe que as restrições diferíveis não podem ser usadas como árbitros de conflito em uma instrução INSERT que inclui uma cláusula ON CONFLICT DO UPDATE.

Portanto, o truque é não verificar a consistência dos dados até o final da transação. Vamos tentar!

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

BEGIN;

 

CREATE TABLE uProfiles (

        uid int8 NOT NULL PRIMARY KEY,

        payload jsonb NOT NULL

);

 

CREATE TABLE Users (

        uid int8 NOT NULL PRIMARY KEY,

        uname text NOT NULL

);

 

ALTER TABLE Users

        ADD FOREIGN KEY (uid) REFERENCES uProfiles (uid)

                DEFERRABLE INITIALLY DEFERRED;

 

ALTER TABLE uProfiles

        ADD FOREIGN KEY (uid) REFERENCES Users (uid)

                DEFERRABLE INITIALLY DEFERRED;

 

INSERT INTO Users VALUES (1, 'Renato Lucena');

 

INSERT INTO uProfiles VALUES (1, '{}');

 

COMMIT;

Neat! Works like a charm!

1

SELECT * FROM Users, uProfiles;

uid|uname      |uid|payload|
---|-----------|---|-------|
  1|Renato Lucena|  1|{}     |

 

Do meu ponto de vista, este método pode ajudar a dividir tabelas largas em várias estreitas, onde algumas colunas são muito lidas.

Fonte: 

- https://www.cybertec-postgresql.com/en/1-to-1-relationship-in-postgresql-for-real/

- https://stackoverflow.com/questions/15037349/creating-postgresql-tables-relationships-problems-with-relationships-one-t

https://www.postgresql.org/docs/6.5/sql22234.htm


0

Share

Donate to Site


About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to 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