Tenho três tabelas event, person e event_person_map
evento:
id integer PRIMARY KEY
event_name text
event_date date
pessoa:
id integer PRIMARY KEY
full_name text
email_address text
mapa_pessoa_evento:
id integer PRIMARY KEY
person_id integer [referencing person.id]
event_id integer [referencing event.id]
Como posso estruturar minha consulta para obter uma saída que liste informações sobre o evento e a lista de participantes?
Um exemplo da saída seria algo assim:
event_id| event_name | event_date |participants|
--------+------------+------------+------------+
1 | event1 | 1.1.2024 | json list |
2 | event2 | 1.2.2024 | json list |
3 | event3 | 1.3.2024 | json list |
4 | event4 | 1.4.2024 | json list |
A estrutura da lista json de participantes deve ser semelhante a esta:
[
{
"id":1,
"full_name":"John Doe",
"email_address":"[email protected]"
},
{
"id":2,
"full_name":"Jane Doe",
"email_address":"[email protected]"
}
]
Entendo como obter a lista de participantes separadamente, mas não tenho certeza do que fazer para que ela faça parte da consulta com informações do evento.
A saída não precisa ser estritamente assim, se houver soluções diferentes que sejam mais elegantes sou todo ouvidos.
Você pode usar uma subconsulta correlacionada onde agrega JSON de outras tabelas.
Uma opção alternativa, mais clássica, mas menos flexível, é juntar tudo e fazer um gigante
GROUP BY
.Nota lateral sobre design:
id
coluna separada. Sua chave primária deve ser uma composição de duas colunas, comoPRIMARY KEY (person_id, event_id)
._map
; deve ser óbvio pelo próprio nome o que são.Se eu fosse você, perderia o JSON e usaria o tipo PostgreSQL ARRAY - o PostgreSQL possui recursos de processamento de array muito poderosos que podem ser mais adequados às suas necessidades.
JSON geralmente é para dados "variáveis" onde os nomes e valores dos campos podem variar (itens de roupas seriam um bom exemplo), enquanto seus dados são bastante "estáticos" - ou seja, a tabela "pessoa" está totalmente definida no início.
O que fiz para resolver seu problema foi o seguinte (todo o código abaixo está disponível no violino aqui ):
CRIE nossas tabelas:
Em seguida, preenchemos nossas tabelas com uma pequena quantidade de dados de amostra:
e
e agora, quem participou de quais eventos:
Primeiro, executamos esta consulta para obter todos os dados de todos os eventos - quais eventos foram atendidos e quem:
Resultado:
Mas esse não é exatamente o resultado que você deseja - você deseja que os eventos sejam agregados por participante - então usamos a função
ARRAY_AGG
( exemplos ) da seguinte maneira:Resultado:
Esta é uma alternativa à abordagem JSON, mas acredito que seja mais adequada ao modelo de dados apresentado. HTH e bem-vindo ao dba.se!