Bom, nos meus 4 anos de trabalho com banco de dados, nunca ví, em
nenhum deles, uso de herança. Alguém usou/conhece algum ambiente onde exista
uma implementação de herança numa base de dados?
2008/9/5 Magno Junior <[EMAIL PROTECTED]>
> Qual a melhor forma de modelar um banco onde duas tabelas diferente
> 'compartilham' um mesmo 'id' ?
>
> por exemplo:
> tenho dois tipos de funcionarios em uma empresa : FUNC1 e FUNC2 ,
> sendo que os dois possuem algumas coisas em comum, inclusive o ID (que
> poderia ser o cpf, por exemplo). Nesse caso, meu banco nao poderia
> deixar que eu colocasse o mesmo cpf existente em FUNC1 na tabela
> FUNC2.
>
> Acho que poderia fazer por herança ( e no modelo OO seria o mais
> correto ), mas eu vi que o postgresql não propaga as restriçoes do pai
> para os filhos.
> Não sei muito bem como o postgresql trabalha com OO, de qualquer
> forma, pelo visto, eu acabaria com dois ID's iguais em tabelas
> diferente.
>
> Eu poderia fazer utilizando 3 tabelas, sendo 1 tabela contendo todos
> os 'id's' possivel para as outras 2 tabelas 'filhas':
> T1[ id ]
> T2[ id , coisas_de_t2 ] // id é chave primaria de T2 e chave
> estrangeira para T1
> T3[ id, coisas_de_t3 ] // id é chave primaria de T3 e chave
> estrangeira para T1
> Dessa forma só poderia colocar uma restriçao para que nenhum id no
> pai se repetisse ( mas acho que ainda assim poderia ter um elemento da
> T2 e da T3 com o mesmo id ). Acho que acabaria utilizando gatilho para
> controlar os elementos que forem inseridos.
>
> Acho que tambem poderia eliminar essa primeira tabela( T1 ) e fazer
> utilizando gatilho, sempre que fosse inserido um novo elemento em uma
> das tabelas, eu verificaria na outra se já existe alguma com o id
> especificado.
> Eu acabaria com duas tabelas diferente para dois 'objetos parecidos',
> isso não seria ruim?
>
> O problema é que na pratica as tabelas sao muito parecidas,
> só muda um codigo onde em um tipo o codigo pode receber letra e
> numeros, enquanto no outro tipo o codigo só pode ser numero ( o
> tamanho do codigo tambem é diferente ).
> qual a melhor forma de fazer isso?
>
Eu usaria um mesmo *"sequence"* para ambas as tabelas (assumindo que
sua chave seja sintética - gerada sequencial e automaticamente).
Quando se cria um campo do tipo "SERIAL", na verdade, cria-se um objeto
*"SEQUENCE"* no mesmo *"schema"* com o identificador "[nome da tabela]_[nome
do campo]_seq". Supondo que o *serial* seja "func1_id_seq", eu rodaria a
query:
*ALTER TABLE* func2 *ALTER COLUMN* id* DEFAULT* nextval('func1_id_seq');
--
William Leite Araújo
Analista de Banco de Dados - QualiConsult
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral