Eu tenho lido sobre como o Pinterest fragmentou seus bancos de dados MySQL aqui .
Uma das coisas que eles falam nesse post é ter tabelas de “mapeamento unidirecional” como
CREATE TABLE board_has_pins (
board_id INT,
pin_id INT,
sequence INT,
INDEX(board_id, pin_id, sequence)
) ENGINE=InnoDB;
e depois um oposto pin_owned_by_board
.
Minha pergunta é, por que você teria essas “tabelas unidirecionais” para “mapeamento” e não apenas uma com uma estrutura de índice diferente? Eu não acho que ele possa parar as duplicatas devido à sequência ser um timestamp unix, mas o índice limita apenas a capacidade de selecionar pelo board_id
nesta instância ou pelo índice completo (de qualquer maneira, de maneira eficiente). Então, por que não ter índices separados em board_id
e pin_id
? Isso se deve ao fato de que um pino poderia, em teoria, viver em um fragmento separado, mesmo que eles tentem mantê-los no mesmo, então faz sentido torná-lo “unidirecional”?
Concordo que é uma mesa estranha.
Nenhuma restrição de exclusividade, então dups podem ocorrer. Eu mudaria
INDEX
paraPRIMARY KEY
.Nenhum índice na direção oposta, então é improvável que use dessa maneira. Eu adicionaria outra coluna e
INDEX(bin_id, board_id, pin_to_board sequence)
Por outro lado, talvez haja muita atividade na tabela - como atualizar todos os valores de sequência com frequência. Ainda assim, o InnoDB realmente preferiria ter um
PRIMARY KEY
, e esse triplo parece o PK 'certo'.Eu provavelmente trabalharia mais para evitar possíveis dups de timestamp.