Os dados
Digamos que eu tenha uma grade representando todas as pessoas em uma sala e as conversas que elas têm quando falam entre si.
John | Susana | Brian | Rachel | |
---|---|---|---|---|
John | Resseguro | Trabalhar | Esportes | Filmes |
Susana | Trabalhar | Resmungando | Viagem | Música |
Brian | Esportes | Viagem | Nada | Comida |
Rachel | Filmes | Música | Comida | Auto-depreciativo |
O banco de dados
Inicialmente considerei apenas fazer tabelas regulares de People
eConversations
A Conversations
mesa seria uma chave etopic
participant1
participant2
O dilema
A ordem dos participantes é totalmente irrelevante. Uma simples pergunta “Sobre o que Rachel e Brian conversam” torna-se uma consulta complicada de executar.
Portanto, uma de duas coisas deve ser feita:
- Dados redundantes são adicionados ao banco de dados: (Rachel e Brian) ou (Brian e Rachel)
- Uma consulta ridiculamente complicada é necessária para consultar os dados não redundantes porque você não sabe se Rachel é participante1 ou participante2.
Seguir com 1 acima cria um modelo de banco de dados O (n ^ 2) insustentável, enquanto 2 parece um pesadelo de DBA tentando consultar dados significativos.
A questão
Como faço para modelar uma estrutura de dados como esta? O SQL é a ferramenta certa para o trabalho ou devo pesquisar algo totalmente diferente?
Os dados
Armazenar a mesma combinação de participantes duas vezes é um erro grave de normalização e não deve ser considerado uma opção. Os dados únicos estão em uma das matrizes triangulares correspondentes, por exemplo:
O banco de dados
O banco de dados deve impor as restrições necessárias.
A pergunta
Supondo que você não possa simplesmente construir a cláusula WHERE com um par ordenado para Participante1 e Participante2, consultar a tabela acima é algo como:
Não vejo como isso pode ficar tão complicado.
A vista
Você sempre tem a possibilidade de obter uma visão não normalizada dos dados que contém todas as permutações.
Um relacionamento "muitos para muitos" normalmente é modelado usando uma tabela de "junção" (ou "link") com chaves estrangeiras apontando para as respectivas entidades.
No seu caso você terá uma tabela Person , uma tabela Conversation e uma tabela PersonConversations com dois atributos:
ConversationId
ePersonId
.Dito isto, a tarefa pode ser alternativamente, e talvez mais naturalmente, modelada por um gráfico e implementada usando um banco de dados de gráficos.