DICA PARA ESTRUTURA DO BANCO DE DADOS

MARCELOKROL 03/06/2014 22:51:57
#438703
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
KERPLUNK 04/06/2014 10:06:41
#438712
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.
MARCELOKROL 04/06/2014 10:38:35
#438716
é 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[ô]
KERPLUNK 04/06/2014 11:13:04
#438718
Então você vai ter uma tabela de afiliados e outra com relacionamentos de filiados N para N.
MARCELOKROL 04/06/2014 12:41:11
#438721
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
KERPLUNK 04/06/2014 13:24:25
#438723
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
MARCELOKROL 09/06/2014 22:23:05
#438808
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!
LLAIA 10/06/2014 13:28:07
#438816
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
MARCELOKROL 10/06/2014 14:14:45
#438817
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
MARCELOKROL 11/06/2014 12:51:32
#438844
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
Tópico encerrado , respostas não são mais permitidas