Diagrama Entidade-Relacionamento e descrição detalhada das tabelas e seus relacionamentos no banco de dados da API Trace Point.
O diagrama abaixo ilustra as principais tabelas do banco de dados, suas colunas com respectivos tipos de dados, e os relacionamentos entre elas, fornecendo uma visão clara da estrutura de dados da aplicação. A explicação detalhada de cada tabela e relacionamento segue abaixo.
O banco de dados trace_point
é projetado para gerenciar usuários, locais, eventos e os relacionamentos entre eles, como quais usuários visitaram quais locais e quais usuários estão inscritos em quais eventos. A seguir, uma descrição de cada tabela baseada no esquema fornecido.
user
(Usuário)Armazena informações sobre os usuários da plataforma.
id
(UUID, Chave Primária, Obrigatório, Padrão: Geração automática de UUID)name
(VARCHAR(50), Obrigatório) - Nome completo do usuário.profile_pick
(VARCHAR(60), Opcional) - URL para a foto de perfil.role
(ENUM public.user_role_enum
, Obrigatório, Padrão: 'visitor') - Papel do usuário (ex: 'admin', 'visitor', 'organizer').email
(VARCHAR(40), Obrigatório, Único) - Email de login do usuário.password
(VARCHAR(60), Obrigatório) - Senha do usuário (armazenada como hash).Referenciada por: Tabela booking
(via user_id
), Tabela visited_places
(via user_id
).
place
(Local)Representa os locais físicos cadastrados na aplicação.
id
(UUID, Chave Primária, Obrigatório, Padrão: Geração automática de UUID)name
(VARCHAR(40), Obrigatório) - Nome do local.type
(ENUM public.place_type_enum
, Obrigatório, Padrão: 'turistc') - Tipo do local (ex: 'cultural', 'restaurant').postal_code
(VARCHAR(10), Obrigatório) - CEP do local.street
(VARCHAR(30), Obrigatório) - Rua/Logradouro do local.number_house
(VARCHAR(6), Obrigatório) - Número do endereço.complement
(VARCHAR(100), Obrigatório) - Complemento do endereço.Referenciada por: Tabela event
(via place_id
), Tabela visited_places
(via place_id
).
event
(Evento)Descreve os eventos que ocorrerão e podem ser gerenciados pela plataforma.
id
(UUID, Chave Primária, Obrigatório, Padrão: Geração automática de UUID)title
(VARCHAR(40), Obrigatório) - Título do evento.event_date
(TIMESTAMP without time zone, Obrigatório) - Data e hora do evento.description
(VARCHAR(150), Obrigatório) - Descrição do evento.place_id
(UUID, Chave Estrangeira para place.id
, Opcional) - Identificador do local onde o evento ocorre. Pode ser NULO se um evento não tiver um local específico ou ainda não definido.Referenciada por: Tabela booking
(via event_id
).
booking
(Reserva/Inscrição em Evento)Implementa o relacionamento Muitos-para-Muitos entre Usuários (user
) e Eventos (event
).
event_id
(UUID, Parte da Chave Primária, Obrigatório, Chave Estrangeira para event.id
) - Identificador do evento. Ações em cascata: ON UPDATE CASCADE, ON DELETE CASCADE.user_id
(UUID, Parte da Chave Primária, Obrigatório, Chave Estrangeira para user.id
) - Identificador do usuário.A combinação de event_id
e user_id
é a chave primária, garantindo que um usuário só possa se inscrever uma vez em cada evento.
visited_places
(Locais Visitados)Implementa o relacionamento Muitos-para-Muitos entre Usuários (user
) e Locais (place
), e armazena a data da visita.
user_id
(UUID, Parte da Chave Primária, Obrigatório, Chave Estrangeira para user.id
) - Identificador do usuário. Ação em cascata: ON DELETE CASCADE.place_id
(UUID, Parte da Chave Primária, Obrigatório, Chave Estrangeira para place.id
) - Identificador do local. Ação em cascata: ON DELETE CASCADE.visit_date
(TIMESTAMP without time zone, Obrigatório, Padrão: now()
) - Data e hora em que a visita ocorreu.A combinação de user_id
e place_id
é assumida como a chave primária para este relacionamento, indicando que um usuário só pode ter um registro de visita para um local específico nesta tabela; a visit_date
armazena quando essa única visita registrada ocorreu. Para registrar múltiplas visitas de um mesmo usuário ao mesmo local em datas diferentes, a visit_date
precisaria ser incluída na chave primária (formando uma PK composta por user_id, place_id, visit_date
) ou a tabela visited_places
deveria ter um identificador único próprio (como um campo id
do tipo UUID).
booking
): Muitos-para-Muitos. Um usuário pode participar de vários eventos, e um evento pode ter vários usuários participantes.visited_places
): Muitos-para-Muitos com atributo (visit_date
). Um usuário pode visitar vários locais, e um local pode ser visitado por vários usuários, registrando-se a data de cada visita (considerando a discussão sobre a chave primária de visited_places
para permitir múltiplos registros por par usuário-local).event.place_id
): Muitos-para-Zero-ou-Um (lado do Local). Um evento pode opcionalmente estar associado a um único local (pois place_id
em event
é uma chave estrangeira que pode ser NULA). Múltiplos eventos diferentes podem estar associados ao mesmo local. Um local pode ter vários eventos associados a ele ou nenhum.