DÊVIDA DE CRIAN?A SOBRE CHAVE ESTRANGEIRA

MARCOS 25/01/2016 17:54:31
#456524
Prezados colegas,
Se tem algo que perdi a vergonha a muito tempo,
é de perguntar.Mesmo quando minhas dúvidas
são infantis.Pois bem:

O caso:

Criei numa ferramenta Case (DBDesigner Fork),meu
Banco de Dados(Sql Server Express) ,devidamente
normalizado.A ferramenta me permite exportar o Script
para o ClipBoard do Windows.Copiei o Script e no meu
projeto que fiz no Visual Studio .NET (VB.Net) e usei
o Explorador de Objetos SQL Server,para executar
o Script.Tudo foi perfeito e o Script,criou todas as tabelas
em meu Banco De Dados Sql Server Express.

Minha dúvida:

O Explorador de Objetos Sql Server do Visual Studio,permite
que eu visualize o código de criação de cada tabela do Banco.
Eu reparei ,que na sintaxe do código,não existe nada indicando
a chave estrangeira da tabela ( Que eu criei na ferramenta Case
e relacionei a chave primária de outra tabela).
Afinal,o que me permite no Banco de Dados [Ô]fisico[Ô], indicar que
um determinado campo de uma tabela,esta relacionado a outro???
Pergunto isto,pois não vi nada na sintaxe de criação das tabelas
indicando os relacionamentos que fiz na ferramenta case.

Agradeço qualquer orientação
ACCIOLLY 25/01/2016 21:45:07
#456527
Resposta escolhida
Eu trabalho com o MySql e utilizo o WorkBench. Quando exporto o diagrama para o banco (Foward Enginner) a ferramenta me mostra toda a codificação SQL. repare que na codificação tem linhas que indicam que é uma chave estrangeira FORING KEY e a qual atributo de outra tabela ela está referenciada.
KURTGU 26/01/2016 13:06:54
#456538
Marcos sua dúvida não e de criança e de pessoa interessada q está procurando aprender e buscando informações agora tem uns control c control v ai que da medo.
MARCOS 26/01/2016 14:15:00
#456542
OK,Acciolly!
Ao que parece minha dúvida,não foi tão ingenua assim.
Pois,conforme você mesmo mostrou é necessário sim
que na sintaxe de criação da tabela,o relacionamento
seja indicado.

O que aconteceu,é que ao criar meu Script na ferramenta case,
Eu optei por não ter integridade referencial,o que fez a ferramenta
não criar o relacionamento(Foreign key) no Script .

Mas,isto me faz chegar a seguinte conclusao [Ô]estranha[Ô].Peço orientação,
para saber se minhas conclusoes são corretas:

1.) Digamos que eu tenho duas tabelas: Funcionario e Dependentes

- Digamos que eu criei na tabela Dependentes,um campo para funcionar como chave estrangeira.
- Mas,ao mesmo tempo não crio um relacionamento entre as tabelas no Banco.

Concluo que poderei no meu código, usar istruções Sql normalmente para relacionar as
tabelas,usando o campo que criei para chave estrangeira.Mesmo sem ter relacionamentos criados
no Banco (Foreign Key).
Me parece,que a utilidade prática de se criar os relacionamentos,é o de possibilitar as Bancos
implementar a Integridade Referencial.Mas,com ou sem relacionamento criado no Banco,posso
executar minha instrução Sql e trazer dados de ambas as tabelas ,usando os campo de chave
estrangeira que criei.

Estou Certo???
ACCIOLLY 26/01/2016 17:02:28
#456548
Mas,com ou sem relacionamento criado no Banco,posso
executar minha instrução Sql e trazer dados de ambas as tabelas ,usando os campo de chave
estrangeira que criei.

Estou Certo???


Digamos que ao fazer um select sim. O problema é que você corre um grande risco de se ter registros órfãos. O que no seu exemplo seriam dependentes de funcionários que não existam.
Agora se vc cria esse relacionamento, conforme manda a terceira forma normal, você jamais terá um banco como esse abaixo:

-------------------------------Funcionários---------------------------------
ID Nome Sexo
--------------------------------------------------------------------------------
1 Joao M
3 Sofia F
5 Alice F
--------------------------------------------------------------------------------


------------------------------Dependentes---------------------------------
ID Nome Sexo ID_Funcionario
--------------------------------------------------------------------------------
1 Maria F 5
2 Stefanni F 1
3 Camila F 2
4 Kleber M 3
---------------------------------------------------------------------------------

Repare que na tabela dependentes existe um registro órfão, pois o funcionário cuja chave primária é 2 não existe na tabela funcionários. Agora se eu fizer um relacionamento bonitinho, como manda o figurino, os registros da tabela funcionários só poderão ser excluidos se e somente se não houver registros filhos dele na tabela dependentes.
Mas e daí? eu só posso apagar um registro da tabela pai se antes apagar todos os registro referentes na tabela filho? Tecnicamente sim. Mas pra evitar esse tipo de trabalo existem as Trigers, ou seja, ao excluir um registro da tabela pai, automaticamente o SGDB manda um comando para excluir todos os registros referentes na tabela filho também.

Como o KURTGU disse antes, não fique envergonhado em perguntar, todos nós um dia passamos pelo que vc está passando. Uma hora agente engrena! rsrsrsr

Té mais.
Tópico encerrado , respostas não são mais permitidas