Jump to content


Photo

Relacionamento


  • Faça o login para participar
6 replies to this topic

#1 beneti

beneti

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 20/02/2008, 14:30

Por exemplo... tenho três tabelas e quero relacioná-las. Tenho a tabela usuário, produto e compra.

usuario
----------------
id
nome
sobrenome
login
----------------

produto
----------------
id
titulo
descricao

preco
----------------

compra
----------------
id
id_usuario
id_produto

valor
----------------

Defini login como PK de usuario, titulo+descricao como PK de produto. Agora em compra eu quero definir os dois ids como PK e FK e dá erro!
Eu consigo inserir na tabela sem ter nada na tabela produto ou usuario. Era pra dar erro de integridade de chaves.

A pergunta é tonta, mas: minha FK tem que ser PK da tabela referênciada?

#2 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 21/02/2008, 14:16

Cara, muito esquisito...
Mas afinal, porque sua PK é titulo + descricao?
Como você pretende relacionar um campo numérico (id_produto) com dois campos string (titulo e descricao)? É isso que você está tentando fazer?
Suas PKs não deveriam ser por ID?

#3 beneti

beneti

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 21/02/2008, 19:10

Não, cara.
Eu defini chave primária o título e a descrição, pois não quero que se repitam, que é a função da chave primária.
Titulo: Televisão 29"
Descrição: Marca Sony, tela plana

Se eu tentar inserir o mesmo registro, não vou conseguir. É o que eu quero. O ID é para relacionar com outras tabelas.
ex:

usuario
----------------
1
jose
silva
jsilva
----------------

produto
----------------
1
televisao 29"
sony, tela plana
1000
----------------

compra
----------------
1
1
1
2000
----------------

Quer dizer que o usuario da ID 1, comprou o produto da ID 1. Certo? Mas mesmo quando as tabelas usuario e produto estão vazias eu consigo inserir registros na tabela compra. Era para dar erro de integridade das chaves...

#4 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 25/02/2008, 15:13

Não é bem assim.
Não permitir que valores se repitam é a função da Unique Key, não da Primary Key.
Se você usa ID, é muito melhor que use este como índice e os outros valores como UK.

Mas tudo bem! Respondendo sua pergunta... não, a FK não tem necessariamente que ser PK da tabela referenciada, mas ajuda bastante!

Eu ainda não entendi muito bem como está seu banco porque é uma modelagem um pouco fora do comum. Se você quiser postar o script de criação dessas tabelas, acho que entenderei e poderei te ajudar. Ok?

#5 beneti

beneti

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 25/02/2008, 15:27

Sem dúvida é fora do comum, sim.
Geralmente, para cada tabela definimos a ID como chave primária... Eu estava experimentando um outro modo, já que eu posso usar o login como chave primária ou qualquer outro campo. Eu nunca defini um campo como UK. Por exemplo...

eu tenho o registro
------------------
1
jose
silva
jsilva

um usuario vem e tenta cadastrar...

joao
silva
jsilva

Como você barraria sem ter que ficar checando? Pois é um saco checar... É muito mais simples manipular o erro, quando você o prevê. Se eu defino o login como PK, dará erro, certo? Com a UK também? UK tem em todos os bancos ou só no MySQL? Digo isso, pois o auto_increment do mysql que é uma mão na roda, não tem no oracle (que você tem que ficar criando sequence e trigger).

#6 boirock

boirock

    Tecnologia para todos (agora hexa campeão)

  • Usuários
  • 1559 posts
  • Sexo:Masculino
  • Localidade:Curitiba - PR
  • Interesses:PostgreSQL - PHP

Posted 25/02/2008, 15:54

Sim, se seu campo login está setado como UK e você tenta cadastrar um segundo registro com o mesmo login, vai dar erro de inttegridade abortando a transação. Igualzinho aconteceria com a PK, só que gerando índices com números pequenos ao invés de grandes textos (no caso de uma chave PK composta por nome do produto e descrição, por exemplo...).
Não sei se tem em "qualquer banco" porque o mercado tá cheio de SGBDs né? Mas não consigo lembrar de nenhum SGBD que não tenha Unique Key.

E quanto ao auto_increment, na verdade é o MySQL que está na contra-mão. Praticamente todo o resto dos SGBDs modernos usa SEQUENCEs.
Até concordo que é mais trabalhoso, mas é bem mais flexivel... e quando você acostumar a usar sequences, não fará muita diferença. ;)
O PostgreSQL criou uma solução "preguiçosa" que eu costumo utilizar.
Você seta o campo com o tipo SERIAL.
Na verdade esse tipo não existe. O que o Postgres vai fazer é setar o campo como int e criar a sequence e todo o resto sozinho. Aí, se quiser customizar, fica mais fácil.
Infelizmente (Até onde eu sei) esse recurso não está disponível no Oracle, já que você o citou.

Blz?

#7 beneti

beneti

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 25/02/2008, 19:20

Interessante. Comecei a definir com UK, não sabia. Eu não tinha idéia dos índices que você citou... embora tenham vários SGBD, alguns são os mais usados e eu não sabia que o mysql estava na contra mão, nesse aspecto.
Mas isso aí.. valeu, cara!
:D




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq