Domanda

Ho questa tabella seguente:

Matches -> match_id, team_a_id , team_b_id, score
.

Questa tabella registra le partite tra due squadre (Team A e Team B).Tuttavia, a volte squadra un gioco come ospite e talvolta il team B gioca come l'host.Pertanto, quando ho provato a trovare le partite della storia tra la squadra A e il team b.Quello che attualmente sto facendo è

select * from matches where (team_a_id = 1 and team_b_id = 2) or (team_a_id = 2 and team_b_id = 1);
.

C'è un approccio migliore a tale caso?Per quanto riguarda la query sopra, ho ragione di includere l'indice di combinazione team_a_id e team_b_id?Ma anche così, allora ho ancora un logico o una condizione tra AB o BA.

In alternativa , Ho un'altra idea, cioè avere un altro tavolo lasciato dire la cronologia

History -> team_hash, match_id
.

Costruisco manualmente Team_Hash dove hash(a,b) == hash(b,a).Ma questo provoca un inserto leggermente più lento ma più veloce leggere.O è davvero più veloce leggere?

È stato utile?

Soluzione

Supponendo che vi sia un indice composito su {team_a_id, team_b_id}, il DBMS può eseguire la dichiarazione SQL utilizzando solo due cerchi di indice (uno per team_a_id = 1 and team_b_id = 2 e l'altro per team_a_id = 2 and team_b_id = 1), che è molto veloce. Non mi aspetto che dovresti trovare le prestazioni carenti.


.

Tuttavia, c'è un modo per eliminare uno di questi cerchi indice. Aggiungi un vincolo ...

CHECK(team_a_id < team_b_id)
.

... e codifica una "direzione" (cioè quale squadra è host) in un campo separato se necessario. In questo modo, sai che team_a_id = 2 and team_b_id = 1 non può mai essere vero, quindi devi solo cercare su team_a_id = 1 and team_b_id = 2.


.

hashing "simmetrico" è un'idea ordinata, ma:

    .
  • La correttezza dell'Hash non può essere applicata in modo dichiarato - dovrai farlo attraverso un trigger o a livello di applicazione.
  • Sono dati ridondanti. Dovrai continuare team_a_id e team_b_id comunque per risolvere i conflitti di hashing. I dati più grandi significa efficacemente la cache più piccola.
  • Può effettivamente aumentare il numero di indici - l'applicazione efficiente dell'integrità referenziale richiederà probabilmente indici su team_a_id e team_b_id anche se non è necessario per la query SQL effettiva. Oltre a mettere più pressione sulla cache, ogni indice aggiuntivo deve essere mantenuto, potenzialmente ferire le prestazioni Insert / Update / Elimina. La situazione è particolarmente seria in Aooodb in cui non è possibile disattivare il clustering, quindi gli indici secondari tendono ad essere più costosi rispetto alle tabelle basate su mucchio (vedere gli "svantaggi del clustering" in Questo articolo ).

Altri suggerimenti

Puoi anche rendere la tua clausola dove qualcosa come questo

((team_a_id = 1 and team_b_id = 2) or (team_a_id = 2 and team_b_id = 1))
AND team_a_id IN (1,2) AND team_b_id IN (1,2)
.

In questo modo sarà possibile utilizzare un indice come (team_a_id, team_b_id).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top