Uma curiosidade. Gostaria de saber como vocês criam as tabelas Pessoa e Endereço. Se é com a chave estrangeira de Endereco na tabela Pessoa ou com a chave estrangeira de Pessoa na tabela Endereco ou ainda se cria apenas uma tabela Pessoa com os atributos de endereço dentro dela. Existe diferença entre as três abordagens e qual seria a melhor maneira de fazer esta modelagem?
Uma curiosidade. Gostaria de saber como vocês criam as tabelas Pessoa e Endereço. Se é com a chave estrangeira de Endereco na tabela Pessoa ou com a chave estrangeira de Pessoa na tabela Endereco ou ainda se cria apenas uma tabela Pessoa com os atributos de endereço dentro dela. Existe diferença entre as três abordagens e qual seria a melhor maneira de fazer esta modelagem?[/quote]
Depende da regra do negócio!
Pessoa só pode ter 1 endereço?
Pessoa pode ter mais de 1 endereço?
É importante separar endereços? (ex.: caso precise de relatórios e gráficos)
Bom, digamos que cada pessoa tenha um único endereço e não é importante separar o endereço. Mas endereço só existe se estiver relacionado a uma pessoa. Que abordagem você escolheria?
Uma curiosidade. Gostaria de saber como vocês criam as tabelas Pessoa e Endereço. Se é com a chave estrangeira de Endereco na tabela Pessoa ou com a chave estrangeira de Pessoa na tabela Endereco ou ainda se cria apenas uma tabela Pessoa com os atributos de endereço dentro dela. Existe diferença entre as três abordagens e qual seria a melhor maneira de fazer esta modelagem?[/quote]
Depende da regra do negócio!
Pessoa só pode ter 1 endereço?
Pessoa pode ter mais de 1 endereço?
É importante separar endereços? (ex.: caso precise de relatórios e gráficos)
[/quote]
Só para complementar
Um endereço pode ser compartilhado com mais de uma pessoa?
Outro fator importante é a normalização do banco ou seja, o banco tem que estar na 3º terceira forma normal ou na 2º já está bom?
1)Se uma pessoa tiver um, e somente um endereço, você pode usar qualquer abordagem. Se você colocar a chave de pessoas em endereço, duas pessoas que moram no mesmo local vão causar redundância de informações. O mesmo vai acontecer para o caso de você usar uma tabela desnormalizada. Deixar a chave de endereços na tabela pessoas, neste caso atenderia de forma satisfatória.
Eu costumo criar uma tabela de pessoas, outra de endereços e uma de tipo endereço. Na minha tabela de tipo endereço eu tenho a chave de pessoa e a chave de endereço, possibilitando armazenar endereços de correspondência, residencial ,etc…
Bom ai teria que ver a normalização do banco ou questão de desempenho. Se for por questão de normalização, nesse caso teria duas tabelas e uma chave estrangeira para o endereço na tabela de endereços, na verdade a chave estrangeira pode ser a chave primária da tabela de endereços também.
Porém se for questão de desempenho, você pode sacrificar a normalização e colocar o endereço como campos na tabela de pessoa!
Bem, como você pediu opinião, eu faria Pessoa com vários endereços, mesmo que agora você use um só, pode ser que sejam necessários vários. Então chave estrangeira de Pessoa na tabela Endereco.
Na tela eu deixaria desnormalizado (campos de endereço juntos com o de pessoa) e na hora de inserir, faria a separação.
Bom, e em questão de relacionamento. Tipo, se eu disser que um endereço só existe se estiver relacionado a uma pessoa, acredito que a melhor maneira de expressar isso seria colocar uma chave estrangeira de pessoa na tabela Endereço. Mas não sei se na prática seria a mais usual.
é que eu penso assim, conceitualmente falando: Quando eu digo que Pessoa tem um endereço, eu vou fazer a modelagem colocando uma chave estrangeira de Endereço na tabela Pessoa. Mas se eu digo que um endereço só vai existir se estiver relacionado a uma Pessoa, eu penso em colocar uma chave estrangeira de Pessoa na tabela Endereço. Mas uma coisa não exclui a outra. Minha lógica está correta ou eu não posso definir as coisas assim?
Pessoa pode ter um ou mais Endereco, e um Encereco pertence a uma única Pessoa. E sim, vc vai garantir que o endereço pertence a um única pessoa, não pode existir sem uma pessoa (claro que a chave estrangeira de Pessoa deve ser not null em Endereco);
Colocar id do endereço na tabela pessoa! Embora funcione está errado! Primeiro você teria que popular o endereço antes da pessoa, caso o endereço seja obrigatório. Segundo se você excluir o a pessoa o endereço não vai ser excluido (você pode definir essa regra de normalização no banco quando criar a chave estrangeira ou via alguma ferramenta de mapeamento objeto relacional). Porém se excluir o endereço a pessoa será excluida!
2)Você faz uma pessoa ter um endereço fazendo com que a chave primária do endereço seja também a chave estrangeira para pessoa, ou seja, o id_pessoa será a chave primária da sua tabela de endereço.
3)Uma pessoa está relacionado a um endereço quando o a tabela endereço tem uma chave primária própria e uma chave estrangeira para pessoa. Nesse caso uma pessoa pode ter mais de um endereço. Ao excluir um ou todos os endereços de uma pessoa ela não é afetada, porém se você excluir uma pessoa todos os endereços relacionados a ela serão excluidos!
Colocar id do endereço na tabela pessoa! Embora funcione está errado! Primeiro você teria que popular o endereço antes da pessoa, caso o endereço seja obrigatório. Segundo se você excluir o a pessoa o endereço não vai ser excluido (você pode definir essa regra de normalização no banco quando criar a chave estrangeira ou via alguma ferramenta de mapeamento objeto relacional). Porém se excluir o endereço a pessoa será excluida!
2)Você faz uma pessoa ter um endereço fazendo com que a chave primária do endereço seja também a chave estrangeira para pessoa, ou seja, o id_pessoa será a chave primária da sua tabela de endereço.
3)Uma pessoa está relacionado a um endereço quando o a tabela endereço tem uma chave primária própria e uma chave estrangeira para pessoa. Nesse caso uma pessoa pode ter mais de um endereço. Ao excluir um ou todos os endereços de uma pessoa ela não é afetada, porém se você excluir uma pessoa todos os endereços relacionados a ela serão excluidos![/quote]
Bom, em relação ao item 1, tenho a impressão que esta opção, embora “errada”, é muito utilizada. Já em relação ao 3, caso em que posso excluir todos os endereços de uma pessoa, como ficaria o relacionamento Pessoa - Endereço, sendo que um pessoa deverá possuir pelo menos um endereço?
Bom, eu nunca vi assim e já trabalho com isso a 10 anos , mas tem loco para tudo!
Do mesmo jeito que no 2! Você não tem como restringir isso pelo relacionamento, assim como você não tem como impedir que alguém insira uma pessoa e esqueça de inserir o endereço!
Esse tipo de restrição é uma regra de negócio e deveria ficar dentro da sua aplicação. Outra maneira de fazer e, que eu não recomendo, é fazer o cadastro através de uma Stored Procedure, por exemplo.
A regra de exclusão também deveria ser feita dentro do sistema, mas também é possível fazer via trigger no banco de dados, algo que eu não recomendo de maneira alguma!
Como eu disse tem loco para tudo . Eu nunca vi isso em projetos comerciais até por que não faz sentido para quem entende o mínimo de banco de dados pois afinal (nesse caso) uma pessoa tem um endereço e não um endereço tem uma pessoa. A mesma coisa se aplica os objetos, pois uma pessoa tem um endereço e não um endereço tem uma pessoa!
A normalização está errada também, pois não deveria haver pessoas sem endereço e nesse caso é possível excluir uma pessoa e seu endereço será mantido na base. Não sei se um cascade no ao excluir uma pessoa usando anotações do JPA funcionária necesse caso.