2011-10-08 31 views
5

Per avere un riferimento, qui è una domanda sul SO che ho chiesto di recente che è rilevante a questa domanda: How to model Friendship relationshipsIn un ambiente di social network, quale sarebbe il modo più semplice per verificare le amicizie a livello globale?

Su questa domanda, abbiamo capito un modo per visualizzare le notizie elementi del feed solo se postato da amici. Tuttavia, ciò di cui ho bisogno è un consiglio su come verificare l'amicizia in un modo più dinamico in modo che possa essere utilizzato in diverse funzioni del sito.

Ad esempio, ho appena installato un sistema di commenti, che consente agli utenti di pubblicare commenti sui post di notizie. Tuttavia, questo non è limitato agli amici, e dovrebbe essere (e in seguito dovrebbe essere reso opzionale dall'autore del post).

La pubblicazione di notizie solo da amici era leggermente diversa perché stavo ricevendo dati direttamente dal database e utilizzando le sottoquestazioni SELECT per ottenere solo i post dagli amici dell'utente corrente. Tuttavia, nell'esempio del commento, voglio solo visualizzare il modulo di commento post se la persona è un amico. In realtà non sto prelevando nulla dal database per selezionare, ordinare e visualizzare.

Conoscere problemi come questo sorgerà molte volte in tutto il sito, quale sarebbe il modo più semplice per verificare l'amicizia? Potrei in qualche modo richiamare tutti gli ID utente di amici dal database in un array di sessione di qualche tipo e quindi fare unoif(in_array($friends))ogni volta che ho bisogno di determinare se la persona in questione è un amico dell'utente attualmente connesso? In cima alla mia testa, sembra che funzionerebbe bene, ma vorrei prima il tuo input.

La domanda che ho collegato sopra spiega come funziona la mia tabella di amicizia, nel caso in cui mi aiuti ad aiutarmi in questo.

+0

'MY_DATA_ACCESS_LAYER.IS_FRIEND (my_id, other_id)' - Utilizzare il database. Adoro il database. Preoccupati per "altre cose" più tardi. (Un'estensione banale è far sì che ci siano più ID da elaborare contemporaneamente: il punto è: se è nascosto nel DAL, non importa e quando - ma davvero * se * - le prestazioni * sono * un problema ci sono molti modi per affrontarlo.) –

+0

@ pst, ti dispiacerebbe spiegarmelo un po 'meglio? Che cosa è esattamente "MY_DATA_ACCESS_LAYER.IS_FRIEND (my_id, other_id)" e come utilizzarlo? Puoi fornire un esempio? – vertigoelectric

+0

Fa parte del DAL (Data Access Layer) e "usa il database". Il nome è atroce e fu scelto per distinguersi. Strutture diverse faciliteranno diversi approcci di DAL, ma sembra che questo sia già presente: cioè, * non * preoccuparsi della sessione o delle cose in_array.Solo preoccuparsi di "limitare l'utilizzo ban banale" quando esiste un caso d'uso delle prestazioni * comprovato * che non soddisfa i requisiti. –

risposta

0

In realtà, è una pessima idea memorizzare l'array amico nella sessione. Cosa succede se qualcuno aggiunge un nuovo amico dopo aver creato la variabile di sessione? Non viene aggiornato nella sessione.

Poiché controllerai la lista di amici un sacco di volte sulla stessa pagina, perché non basta interrogarla e archiviarla in un array locale che puoi continuare ad usare sulla stessa pagina.

Al termine dell'esecuzione della pagina, la matrice verrà eliminata.

Quindi, in pratica, si interroga l'elenco solo una volta.

Un'implementazione consigliata sarebbe quella di seguire il consiglio di "pst" nel commento sopra, e basta interrogare ogni volta che è necessario trovare prima la relazione, poiché è semplice da implementare. Successivamente, quando la velocità della query inizia a diventare un problema, puoi semplicemente modificare l'interno di quel metodo per memorizzare nella cache l'elenco di amici in un array locale quando viene chiamato per accelerare le cose. (utilizzo della memoria di scambio per l'utilizzo del processore).

+0

Grazie per la risposta. Bene, come è ora, ho una query che controlla la tabella 'amicizie' per una corrispondenza valida esistente tra due utenti. Se il numero di righe trovate non è zero, viene determinata un'amicizia. Per utilizzare il metodo dell'array locale, avrei bisogno di modificare la mia query per estrarre tutte le corrispondenze di amicizia valide dalla tabella e quindi testarla. Mi rendo conto ora che l'idea di matrice è meno efficiente. Tuttavia, ha sollevato una domanda che ho. Esiste un punto in cui è possibile interrogare il database troppo spesso, o non è davvero importante? – vertigoelectric

+0

La mia opinione è che la query sul database sta diventando più economica, la potenza della cpu sta diventando più economica. Fondamentalmente, le funzionalità dei computer stanno diventando sempre più convenienti ogni giorno. Quindi la prima cosa che dovresti preoccuparti è fare la cosa giusta. Per prima cosa fallo funzionare con la logica corretta. Quindi vedi se ha bisogno di essere ottimizzato. Se funziona veloce senza alcuna ottimizzazione, si risparmia un sacco di tempo. Se viene visualizzato, almeno i codici sono facilmente comprensibili da chiunque, perché non esiste una logica strana per tentare di accelerare i codici. Renderà i codici più facili da mantenere e ottimizzare. – iWantSimpleLife

+0

Molto probabilmente dovrai scrivere i codici, quindi confrontarli con le condizioni reali di vita, quindi decidere se il numero di query è eccessivo. Ma come regola generale, cerco di fermarmi a 50 query per pagina PHP. – iWantSimpleLife

Problemi correlati