Progettazione di database per confrontare grandi liste di opinioni

3

Ho un'applicazione in cui gli utenti possono valutare gli articoli da un elenco a loro piacimento o non piacere (gli utenti possono anche scegliere di non valutare un articolo).

Ci sono milioni di articoli che possono essere valutati dagli utenti in questo modo positivo / negativo / non classificato. Sto cercando una soluzione a quale tipo di database e design di database sarebbe appropriato per archiviare queste valutazioni, supponendo che ci possano essere migliaia di utenti e che altri dati vengano memorizzati sia sugli utenti che sugli articoli.

Mi piacerebbe essere in grado (preferibilmente in modo efficiente) di interrogare il database per trovare:

  • un elenco di tutti gli elementi preferiti da due o più utenti
  • un elemento casuale che un utente non ha valutato prima
  • un elemento casuale che un utente non ha mai visto prima (non permettendo l'inclusione di quelli che l'utente ha lasciato senza rating)
  • un elemento casuale che ha alcune proprietà specifiche, ad es. solo articoli con una posizione specifica in Europa

La casualità non deve essere molto casuale, ma solo lo stesso ordine per ogni utente.

Un ulteriore potenziale requisito futuro sarebbe quello di avere una funzione in cui un utente può essere presentato con gli elementi che ci si aspetta che gli piaccia, in base a ciò che è piaciuto prima e a ciò che altri utenti con gusti simili hanno gradito.

Ho usato per lo più database basati su documenti, e i requisiti suggeriscono di archiviare gli elenchi di elementi piacevoli e non voluti contro gli utenti, ma questo sembra molto inefficiente. Sono felice di utilizzare un database relazionale se fosse più adatto, o di imparare a utilizzare qualsiasi altro tipo di database. Sospetto che la mia mancanza di esperienza nel database mi impedisca di vedere un design chiaramente migliore.

    
posta Carasel 16.02.2017 - 14:54
fonte

2 risposte

3

Questo potrebbe essere meglio su DBA
Un database relazionale

utente:
id int PK
fName stringa
lName stringa

elemento:
id int PK
stringa descrizione

Valutazione:
id int PK
descrizione stringa vincolo unico

userItemRating:
userID int PK FK all'utente
itemID int PK FK all'elemento
ratingID in FD per la valutazione

due o più

select item.description 
from item 
join userItemRating 
on item.ID = userItemRating.itemID 
where item.Rating > 3 
group by item.description 
having count(*) > 1 

come fare random sarà specifico del database - questo è SQL Server questo è un articolo non valutato per l'utente 5

select top (10) item.description 
from item 
left join userItemRating 
on item.ID = userItemRating.itemID   
where userItemRating.userID = 5 
and userItemRating.itemID is null  
order by newid()
    
risposta data 16.02.2017 - 17:00
fonte
1

Per iniziare, hai bisogno di una tabella di database con utenti e elementi come chiavi esterne e un altro campo che indica come / non mi piace / neutro.

UserId (tabella utente FK), ItemId (tabella articoli FK), valutazione (byte firmato)

Suggerisco che il campo Rating sia un byte firmato con un valore pari a zero che rappresenta il neutro, -1 che rappresenta l'antipatia e 1 che rappresenta il simile. Ciò ti consentirà di determinare rapidamente il numero di Mi piace e Non mi piace per un determinato articolo e il punteggio medio.

    
risposta data 16.02.2017 - 15:08
fonte

Leggi altre domande sui tag