Ho un progetto in cui gli utenti saranno in grado di taggarsi con tag skills (magari predefiniti nel sistema), e quindi i project manager di un'azienda sarebbero in grado di cercare il meglio utente con una serie di competenze per un determinato compito. Ad esempio: Java sarebbe un tag, o forse Android , ecc. Userò un DB relazionale. Ho finora le seguenti opzioni:
- Utenti , UserTags , Tag .
- Utenti e Tag tabelle, memorizzando i tag di ciascun utente come una colonna di testo user_tags (in Utenti ).
N ° 1 è il modo più corretto per farlo in termini di pura progettazione logica, ma al momento della ricerca richiederebbe di interrogare le tre tabelle. Inoltre, il Project Manager può anche cercare per nome dell'utente, quindi forse una query potrebbe essere:
SELECT users.name, users.id FROM users, user_tags, tags WHERE (tags.name={query} AND tags.id=user_tags.tag_id AND user.id=user_tags.id) OR users.name LIKE '%{query}%' LIMIT N .
Non so se si tratta di una query efficiente, nota che ho un OR con una dichiarazione LIKE.
Con l'opzione N ° 2 avrò una penalità di archiviazione (memorizzando molte volte lo stesso nome TAG per ciascun utente), ma forse potrei eseguire una ricerca indicizzata FULLTEXT nella colonna i tag e nome di Utente , quindi la query su una sola tabella con un indice FULLTEXT. Qui la tabella Tag sarà utile come tabella di controllo, convalidando se i tag selezionati dall'utente sono consentiti.
Quindi, quale pensi che sia l'approccio migliore?