[DUVIDA] Modelo de banco de dados para aplicação web de bate-papo
Estou criando uma aplicação de um web-chat para fins de estudo. Estou usando no servidor o banco de dados postgresql, na aplicação nodejs com express e socket-io.
Estou tendo dificuldades em definir como as mensagens serão distribuídas aos usuários e como posso armazena-las referenciando os usuários que receberam essas mensagens.
Em minhas pesquisas encontrei dois jeitos de se fazer a estrutura e modelo do banco, porém em ambas tem alguns problemas que gostaria de compartilhar com vocês.
-
Estrutura 1 - usando o tipo array.
CREATE TABLE usuarios ( id SERIAL PRIMARY KEY, primeiro_nome VARCHAR(30) NOT NULL, ultimo_nome VARCHAR(30) NOT NULL, email VARCHAR(255) NOT NULL, ) CREATE TABLE mensagens ( id SERIAL PRIMARY KEY, mensagem TEXT NOT NULL, data_envio TIMESTAMP, enviado_por INTEGER NOT NULL, recebido_pelo INTEGER[] NOT NULL, FOREIGN KEY (enviado_por, recebido_pelo) REFERENCES usuarios(id) )
Nessa estrutura o campo
recebido_pelo
armazena em um array os usuários que receberão aquela mensagem, tendo os dados parecido com isso:usuarios +----+---------------+-------------+-----------------+ | id | primeiro_nome | ultimo_nome | email | +----+---------------+-------------+-----------------+ | 1 | Jorge | Silva | [email protected] | | 2 | Maria | Ferreira | [email protected] | | 3 | João | Alves | joã[email protected] | +----+---------------+-------------+-----------------+ menssagens +----+--------------+---------------------+-------------+---------------+ | id | mensagem | data_envio | enviado_por | recebido_pelo | +----+--------------+---------------------+-------------+---------------+ | 1 | olá, td bem? | 2022-12-05 13:10:11 | 1 | 2,3 | | 2 | oi | 2022-12-02 15:10:01 | 3 | 1 | | 3 | vamos sair? | 2022-11-06 18:20:15 | 3 | 1,2 | +----+--------------+---------------------+-------------+---------------+
Na primeira mensagem "olá, td bem?" é enviada pelo Jorge e recebida pela Maria e pelo João.
Pesquisando sobre array em banco de dados vi que em algumas situações não são uma boa para serem usadas, pois tem problema de portabilidade com outros bancos de dados caso a aplicação mude de banco no futuro, outros dizem que array funciona como uma muleta e o banco funcionaria perfeitamente sem elas e que tem alguns problemas de pesquisa e busca. Porém o volume de dados seriam menor e a estrutura do banco mais legível. https://stackoverflow.com/questions/20219503/is-it-bad-design-to-use-arrays-within-a-database <- achei um tópico sobre
-
Estrutura 2 - criando uma terceira tabela para relacionar a tabela de usuários e mensagens.
CREATE TABLE usuarios ( id SERIAL PRIMARY KEY, primeiro_nome VARCHAR(30) NOT NULL, ultimo_nome VARCHAR(30) NOT NULL, email VARCHAR(255) NOT NULL ) CREATE TABLE mensagens ( id SERIAL PRIMARY KEY, mensagem TEXT NOT NULL, data_envio TIMESTAMP, enviado_por INTEGER NOT NULL, FOREIGN KEY (enviado_por) REFERENCES usuarios(id) ) CREATE TABLE conversas ( id SERIAL PRIMARY KEY, id_usuarios INTEGER NOT NULL, id_mensagens INTEGER NOT NULL, FOREIGN KEY (id_usuarios) REFERENCES usuarios(id), FOREIGN KEY (id_mensagens) REFERENCES mensagens(id) )
Nessa estrutura a tabela
conversas
relaciona as tabelasusuairos
emensagens
, tendo os dados parecido com isso:usuarios +----+---------------+-------------+-------------------+ | id | primeiro_nome | ultimo_nome | email | +----+---------------+-------------+-------------------+ | 1 | Jorge | Silva | [email protected] | | 2 | Maria | Ferreira | [email protected] | | 3 | João | Alves | joã[email protected] | | 4 | Beatriz | Ferraz | [email protected] | | 5 | Vitor | Silva | [email protected] | +----+---------------+-------------+-------------------+ mensagens +----+--------------+---------------------+-------------+ | id | mensagem | data_envio | enviado_por | +----+--------------+---------------------+-------------+ | 1 | olá, td bem? | 2022-12-05 13:10:11 | 1 | | 2 | oi | 2022-12-02 15:10:01 | 3 | | 3 | vamos sair? | 2022-11-06 18:20:15 | 3 | | 4 | ola galera | 2022-12-12 20:10:15 | 4 | | 5 | tchau | 2022-10-08 16:10:15 | 5 | +----+--------------+---------------------+-------------+ conversas +----+-------------+--------------+ | id | id_usuarios | id_mensagens | +----+-------------+--------------+ | 1 | 2 | 1 | | 2 | 3 | 1 | | 3 | 4 | 1 | | 4 | 3 | 4 | | 5 | 2 | 4 | | 6 | 1 | 2 | +----+-------------+--------------+
Nas 3 primeiras linhas da tabela
conversas
faz referencia a mensagem "olá, td bem?" a onde referencia com os usuários Maria, João e Beatriz que receberão essa mensagem.
Podemos ver que para 1 mensagem enviada 3 campos foram criados para referenciar quem receberá a mensagem. Agora imagine uma conversa no dia a dia quantas mensagens serão enviadas e o volume dessa tabela. Porem até onde pesquisei dessa forma funcionaria em todos os bancos de dados relacionais, é melhor para se fazer pesquisas e buscas e é um bom modelo de banco.
Tendo esses 2 cenários qual modelo/estrutura de banco vocês recomendariam?