Digamos que eu queira armazenar os dados fornecidos pelo usuário em uma tabela chamada post
.
- os dados dos usuários são isolados por
user_id
coluna select sum(likes_count) where user_id = $
deveria ser rápidoselect * from post where id = $
deveria ser rápido
Você poderia ajudar a comparar esses esquemas em termos de desempenho, indexação e casos de uso típicos?
nota: os valores char(24) são a string hexadecimal ObjectId do MongoDB. eles são exclusivos no banco de dados.
Esquema 1:
usando PRIMARY KEY (id)
e índice secundário em(user_id)
CREATE TABLE posts_v1 (
id CHAR(24) NOT NULL,
user_id CHAR(24) NOT NULL,
likes_count INT,
PRIMARY KEY (id),
KEY 'user_id_idx' (user_id)
);
usando PRIMARY KEY (user_id, id)
e índice exclusivo secundário em(id)
Esquema 2:
CREATE TABLE posts_v2 (
id CHAR(24) NOT NULL,
user_id CHAR(24) NOT NULL,
likes_count INT,
PRIMARY KEY (user_id, id),
UNIQUE KEY 'id_idx' (id)
);
Questões:
1- Em quais cenários um esquema teria desempenho melhor que o outro? Por exemplo, consultas que filtram por user_id, id ou ambos.
2- posts_v2
O esquema usa menos leituras de página do InnoDB ao consultar por user_id
? Presumo que, no caso de posts_v2
, a tabela esteja fisicamente agrupada por user_id
, para que possamos recuperar todas as postagens dos usuários com menos varreduras de página. Minha suposição é verdadeira?
3- Integridade e manutenção de dados: Há alguma implicação para integridade de dados, manutenção ou evolução futura de esquema com qualquer design?
4- Casos de uso: Quais são os casos de uso ou cargas de trabalho típicos que podem favorecer um design em detrimento de outro?
Agradeço quaisquer insights ou recomendações que você possa fornecer!