Tag Struttura DB: tag la tabella utilizzando una join e una tabella GROUP BY o pivot (join) utilizzando due join?

0

Sto implementando i tag nella mia domanda e risposta all'applicazione. Gli utenti saranno limitati ai tag disponibili dall'app, quindi non potranno sceglierne di propri. Quindi forse saranno disponibili solo 30-50 tag. Questo potrebbe cambiare in futuro, ma per ora questo è l'accordo.

Sto considerando due opzioni:

Opzione 1:

tabella delle domande: id, titolo, ecc tabella tag: id, name, question_id

Qui la relazione domande-tag è domande ha molti tag e tag appartiene alle domande. In questo modo è richiesto solo un join. Tuttavia, questa tabella di tag potrebbe avere molti duplicati se più di un utente sceglie ad es. tag "hotels". Nel qual caso, durante il recupero di un elenco di tag eseguirò un GROUP BY nell'istruzione SELECT. In questo modo è richiesto solo un join di tabella.

Opzioni 2:

tabella delle domande: id, titolo, ecc tabella question_tags: id, question_id, tag_id
tabella tag: id, nome

In questo modo eliminerò la duplicazione, suppongo, quindi se due utenti selezionano le tabelle "hotel", "hotel" non viene memorizzato due volte .. ma richiede due join: domande (join) tags question_tags (join).

Dal punto di vista delle prestazioni (e senza dover dedicare del tempo a creare test usando migliaia di domande / tag per entrambi i casi), si preferisce l'uno rispetto all'altro? GROUP BY con un solo join di tabelle generalmente sarà più veloce di due join di tabelle in cui potrebbero esserci migliaia di domande, ognuna con alcuni tag propri?

    
posta Martyn 22.03.2015 - 04:31
fonte

1 risposta

0

Vorrei andare con l'Opzione # 2 per eliminare la duplicazione, come hai detto. Non sono sicuro delle implicazioni sul rendimento dei join e del raggruppamento qui, ma credo che sia una rappresentazione più pulita dei dati.

Detto questo, vorrei prendere in considerazione l'utilizzo di un database grafico come Neo4J o Titan. Semplifica l'interrogazione di questi tipi di relazioni.

    
risposta data 22.03.2015 - 07:39
fonte