DICA PARA ESTRUTURA DO BANCO DE DADOS
Ola pessoal
Fui procurado pra montar um sistema de controle de afiliados, o qual os afiliados serão organizados ou melhor cadastrados como o modelo em anexo.
bom a dúvida principal: como estruturar o banco de dados para que o afiliado cadastrado só possa ver os afiliados que ele cadastrou e não os afiliados do outro afiliado principal
Fui procurado pra montar um sistema de controle de afiliados, o qual os afiliados serão organizados ou melhor cadastrados como o modelo em anexo.
bom a dúvida principal: como estruturar o banco de dados para que o afiliado cadastrado só possa ver os afiliados que ele cadastrou e não os afiliados do outro afiliado principal
Se um afiliado vai estar NECESSARIAMENTE subordinado à APENAS UM outro, você pode simplesmente adicionar um campo que indique o código do [Ô]pai[Ô] desse afiliado. Se existe a possibilidade de eles estarem subordinados à mais de um a coisa complica consideravelmente.
é bem isso kerplunk, [ô]C[ô] supordinado a [ô]B[ô] que por sua vez é subordinado a [ô]A[ô], ao listar os subordinados de [ô]A[ô] devem aparecer o [ô]B[ô] e o [ô]C[ô]
Então você vai ter uma tabela de afiliados e outra com relacionamentos de filiados N para N.
TABELA: Usuarios1 (ID, NOME)
1 - JOAO
2 - MARCOS
3 - PEDRO
TABELA: Usuarios2 (ID, ID_SUBORDINADO_A)
3 - 2
2 - 1
Na verdade eu ja tinha pensado nisso mas veja... se eu fizer um select na tabela usuarios procurando os subordinados de JOAO so ou localizar o MARCOS mais se for ver o PEDRO tambem é subordinado de JOAO
1 - JOAO
2 - MARCOS
3 - PEDRO
TABELA: Usuarios2 (ID, ID_SUBORDINADO_A)
3 - 2
2 - 1
Na verdade eu ja tinha pensado nisso mas veja... se eu fizer um select na tabela usuarios procurando os subordinados de JOAO so ou localizar o MARCOS mais se for ver o PEDRO tambem é subordinado de JOAO
Você terá que fazer um join:
Cadastro:
Cod - Nome
1 - João
2 - Pedro
3 - José
4 - Miguel
Ligação:
Usuario - Pai
2 - 1
2 - 3
3 - 4
4 - 1
Quando fizer o join, ficaria assim:
Cod - Nome - Pai
1 - João - null
2 - Pedro - 1
2 - Pedro - 3
3 - José - 4
4 - Miguel - 1
Nesse caso, você teria uma árvore assim:
João
- Pedro
- Miguel
Pedro
- José
José
Miguel
- Pedro
Cadastro:
Cod - Nome
1 - João
2 - Pedro
3 - José
4 - Miguel
Ligação:
Usuario - Pai
2 - 1
2 - 3
3 - 4
4 - 1
Quando fizer o join, ficaria assim:
Cod - Nome - Pai
1 - João - null
2 - Pedro - 1
2 - Pedro - 3
3 - José - 4
4 - Miguel - 1
Nesse caso, você teria uma árvore assim:
João
- Pedro
- Miguel
Pedro
- José
José
Miguel
- Pedro
Crei a estrutura assim:
Tabela: Usuarios1 (id, login)
Tabela: Usuarios2 (id, id_ref)
e fiz o seguinte select: [Ô]SELECT usuarios1.id, usuarios1.nome, usuarios2.id_ref FROM usuarios1 INNER JOIN usuarios2 ON usuarios1.id = usuarios2.id[Ô] e me resultou na figura em anexo.
Agora pergunto, e se eu quizer listar apenas o usuário [Ô]teste9[Ô] com todos os seus subordinados, como que eu faço? Ja quebrei a cabeça e não consegui chegar num resultado!
Tabela: Usuarios1 (id, login)
Tabela: Usuarios2 (id, id_ref)
e fiz o seguinte select: [Ô]SELECT usuarios1.id, usuarios1.nome, usuarios2.id_ref FROM usuarios1 INNER JOIN usuarios2 ON usuarios1.id = usuarios2.id[Ô] e me resultou na figura em anexo.
Agora pergunto, e se eu quizer listar apenas o usuário [Ô]teste9[Ô] com todos os seus subordinados, como que eu faço? Ja quebrei a cabeça e não consegui chegar num resultado!
Conforme vc explicou eu usaria um auto-relacionamento, ou sejam teria um campo chave estrangeira na tabela com a PK da própria tabela. Chamaria esse campo por exemplo de nó-pai.
Depois seria bom se vc estudasse e aplicasse o uso de CTEs.
Dá uma olhada nesse link.
http://technet.microsoft.com/pt-br/library/ms186243(v=sql.105).aspx
Depois seria bom se vc estudasse e aplicasse o uso de CTEs.
Dá uma olhada nesse link.
http://technet.microsoft.com/pt-br/library/ms186243(v=sql.105).aspx
Ola LLAIA
Entao eu ja ate consegui executar um CTE, mais so consegui direto no SQL Server Management Studio, eu nao sei como colocar ele pra ser usado no programa. outra coisa mudei a estrutura das tabelas e ficaram desse modo:
Tabela: Usuarios (id, login, id_ref)
Tabela: Usuarios2 (exclui deixando somente a [ô]usuarios[ô])
Segue o mesmo:
with cte(NivelRecursividade, Id, Login, GerenteId)
as
(
--select simples para retornar o funcionário sem gerente, no caso o
--Presidente da Empresa
select 1, id, login, idref
from usuarios1
where idref = 12
union all
--select com um UNION com o select Anterior
select c.NivelRecursividade+1, F.id, F.login, F.idref
from usuarios1 F
join usuarios1 G on F.idref = G.id
join cte C on F.idref = C.id
)
select * from cte order by 1
Entao eu ja ate consegui executar um CTE, mais so consegui direto no SQL Server Management Studio, eu nao sei como colocar ele pra ser usado no programa. outra coisa mudei a estrutura das tabelas e ficaram desse modo:
Tabela: Usuarios (id, login, id_ref)
Tabela: Usuarios2 (exclui deixando somente a [ô]usuarios[ô])
with cte(NivelRecursividade, Id, Login, GerenteId)
as
(
--select simples para retornar o funcionário sem gerente, no caso o
--Presidente da Empresa
select 1, id, login, idref
from usuarios1
where idref = 12
union all
--select com um UNION com o select Anterior
select c.NivelRecursividade+1, F.id, F.login, F.idref
from usuarios1 F
join usuarios1 G on F.idref = G.id
join cte C on F.idref = C.id
)
select * from cte order by 1
Só pra deixar documentado a solução que construi para o problema:
Criei uma procedure no banco de dados Sql Server 2008 R2 com seguinte estrutura:
ALTER PROCEDURE spSelectRede
@TmpId int
AS
with cte(nivelrecursividade, id, login, idref)
as
(
select 1, id, login, idref
from usuarios1
where idref = @TmpId
union all
--select com um UNION com o select Anterior
select c.nivelrecursividade+1, f.id, f.login, f.idref
from usuarios1 f
join usuarios1 g on f.idref = g.id
join cte c on f.idref = c.id
)
select * from cte order by 1
RETURN
Obrigado a todos pela ajuda
Criei uma procedure no banco de dados Sql Server 2008 R2 com seguinte estrutura:
ALTER PROCEDURE spSelectRede
@TmpId int
AS
with cte(nivelrecursividade, id, login, idref)
as
(
select 1, id, login, idref
from usuarios1
where idref = @TmpId
union all
--select com um UNION com o select Anterior
select c.nivelrecursividade+1, f.id, f.login, f.idref
from usuarios1 f
join usuarios1 g on f.idref = g.id
join cte c on f.idref = c.id
)
select * from cte order by 1
RETURN
Obrigado a todos pela ajuda
Tópico encerrado , respostas não são mais permitidas