Progettazione di un sistema di classificazione

0

Quindi sono andato per lavoro come sviluppatore in un'azienda che vende scatole di cibo gourmet basate su ricette, sono stato rifiutato per un lavoro dopo aver fatto un test tecnico, ho chiesto perché non sono riuscito a migliorare la prossima volta.

Hanno detto che il mio progetto per il sistema di valutazione era scadente. (in pratica volevano un sistema per le richieste di rating). In alcuni contesti di base ho avuto due 'ricette' 'valutazioni' di entità. Queste entità avevano una relazione bidirezionale uno-a-uno. La ricetta ha una valutazione. L'entità di valutazione aveva questi attributi "numberVotes", "totalPoints", "average"

nel mio sistema si farebbe una richiesta POST a

/ ricetta / tasso / {recipieID}

Con un json che assomiglia a

{"rating":4}

la mia funzione di valutazione cercherebbe quindi il punteggio per la ricetta usando {recipieID} se non ce ne fosse uno, i rating successivi restituirebbero quindi la valutazione per la ricetta data +1 all'attributo 'numberVotes', aggiungendo la nota attribuire il punteggio ai "totalpoint", quindi calcolare la media e aggiornare l'attributo "media".

Lo sviluppatore capo ha detto questo

but you would be unable to retrieve the resource of a single rating. Also you are not updating a rating with a particular recipe but a recipe with a particular rating. So POST:/rate/recipe/{id} should be PUT:/recipe/{id}/rating

Nella mia mente questo è un design orribile, sta suggerendo che vorresti memorizzare ogni singola valutazione inviata da un utente. Se tu avessi 10 milioni di utenti che votano un oggetto, stai davvero cercando di immagazzinare 10 milioni di pezzi di spazzatura nel tuo database, solo tu così puoi scoprire come ha valutato Gurtrude il tuo key lime pie su 5?

Quindi, quando vuoi ottenere la valutazione effettiva del key lime key, vuoi recuperare tutti i 10 milioni di risultati e questo? Sono sicuro che ci sia un caso d'uso per archiviare le valutazioni dei singoli utenti per l'analisi degli utenti, ma sono sicuro che vorrai comunque archiviare la valutazione media per il recupero rapido piuttosto che fare ricerche intensive in base alle risorse ogni volta che desideri la valutazione di una ricetta. Ma nel contesto del test tecnico ha chiesto "memorizzare una valutazione per le ricette"

Quali sono i tuoi pensieri?

    
posta user6858980 14.09.2016 - 13:44
fonte

4 risposte

7

Se si desidera impedire a un utente di assegnare una valutazione a una singola persona più volte, è necessario salvare quale utente ha valutato quale destinatario.
Continuiamo a pensare: se si desidera consentire a un utente di rimuovere il punteggio o modificarlo, è necessario memorizzare l'utente che ha valutato un destinatario e il punteggio.

Inoltre, salvando tali valutazioni è possibile eseguire analisi interessanti (raccomandazione Recipie basata su destinatari precedentemente ben valutati, ecc.).

È possibile memorizzare la valutazione media attuale di ciascun destinatario e aggiornarla su una nuova valutazione.

Il tuo pensiero era troppo ristretto e hai tentato un'ottimizzazione prematura che avrebbe ridotto le capacità del sistema finale. 10 milioni significa nulla, stiamo vivendo nell'era dei big data!

    
risposta data 14.09.2016 - 13:55
fonte
5

Penso che l'unico errore che hai fatto non sia stato quello di chiedere una semplice domanda prima di iniziare a progettare qualsiasi cosa:

Quali sono i requisiti del sistema?

Come vedi tutte le risposte hanno una serie di ifs (se vuoi tenere traccia di questo, o l'altra cosa, ecc ...). Ok, ci sono dei requisiti che puoi dedurre in quanto comuni, ma ce ne sono altri che non puoi a meno che gli "stakeholder" non ti permettano di sapere che cosa devono mostrare il loro sistema.

    
risposta data 14.09.2016 - 14:50
fonte
0

Ci sono molte carenze nella soluzione:

  • In base alla scelta delle tue entità, averageRating è calcolato come totalPoints/numRatings . Se si archivia la media nel database, si introduce la ridondanza nel database (che potrebbe causare dati incoerenti nel database)
  • Se non tieni traccia delle distinte votazioni degli utenti, non c'è modo di impedire agli utenti / bot di trasmettere più voti, distorcendo così la valutazione complessiva di una ricetta. Se richiedi agli utenti di specificare per es. il loro indirizzo email per esprimere un voto e definire email,recipieId come chiave primaria nel database per impedire voti multipli.
  • Hai detto che l'archiviazione dei voti distinti potrebbe causare un problema di prestazioni. Mentre questo potrebbe essere vero, la memorizzazione della media nel database è l'ottimizzazione prematura . Se il calcolo medio è diventa un collo di bottiglia, puoi facilmente implementare un livello di cache per risolvere il problema.
  • Penso che la funzionalità di valutazione di Google Shopping richieda che siano presenti valutazioni distinte per essere presenti da visualizzare.
risposta data 14.09.2016 - 14:12
fonte
0

Se si aggregano i dati, si perdono immediatamente dati grezzi che sono un grande no-no quando si tratta di data mining.

Oltre al costo dell'aggregazione dei dati con ciascuna valutazione, avrai perso le informazioni sull'orario in modo da non avere idea della densità del rating, del primo rating, dell'ultimo rating, della popolarità ecc.

La memorizzazione della quantità massima di informazioni offre la massima flessibilità. Se inizi a indovinare cosa vogliono e tagliano gli utenti finali dei dati, limita strongmente la funzionalità del sistema finale.

Se risulta necessario inserire i dati in un formato arrotolato, sarebbe molto semplice aggiungere una vista / schema / database di reporting per supportarlo.

    
risposta data 14.09.2016 - 14:15
fonte

Leggi altre domande sui tag