2012-03-27 18 views
7

Sto costruendo un sito Web che ha una lista dei desideri. Voglio memorizzare la lista dei desideri nella memoria della tabella azzurra, ma voglio anche che l'utente sia in grado di ordinare la loro lista dei desideri, durante la visualizzazione, in diversi modi: data aggiunta, data aggiunta, nome oggetto ecc. Voglio anche implementare il paging che ritengo di poter implementare utilizzando il token di continuazione.Archiviazione tabella di Azure: ordinare per

Come ho capito, "order by" non è implementato e l'ordine con cui i risultati vengono restituiti dalla memoria della tabella si basa sulla chiave di partizione e sulla chiave di riga. Quindi se voglio implementare il paging e l'ordinamento che descrivo, è il modo migliore per implementarlo memorizzando la lista dei desideri più volte con chiave di partizione/chiave di riga diversa?

In questo semplice caso, è probabile che la lista dei desideri non sia così grande e potrei in effetti limitare il numero massimo di elementi che possono apparire nella lista, quindi eliminare il paging e ordinare in memoria. Tuttavia, ho casi più complessi che devo anche implementare per il paging e l'ordinamento.

risposta

8

L'hardware di oggi con migliaia di righe da conservare, in un elenco, in memoria e ordinamento è facilmente supportabile. Qual è il vero problema, come è possibile che tu acceda alle righe nella memoria della tabella usando le Chiavi e non dover fare una scansione della tabella. La duplicazione di righe su più tabelle potrebbe risultare piuttosto ingombrante da mantenere.

Una soluzione alternativa, sarebbe quella di posizionare temporaneamente le righe in SQL Azure e applicare un ordine da lì. Questo può essere efficace se il tuo set di risultati è troppo grande per funzionare in memoria. Per ottenere i migliori risultati, la tabella temporanea dovrebbe avere gli indici necessari.

+0

Sono incline a fare il genere nella memoria e mi preoccupo più tardi se diventa un collo di bottiglia. – s1mm0t

+0

... il tuo secondo suggerimento è comunque interessante. Hai mai fatto qualcosa del genere? Il trasferimento di dati tra storage diversi sembrerebbe di per sé qualcosa di lento. – s1mm0t

+0

Non l'ho fatto di recente. Dato che questo probabilmente sta funzionando in un mondo disconnesso, e considerando la scalabilità su più istanze, il caricamento del set di risultati, dall'archiviazione della tabella, alla memoria locale per ogni richiesta potrebbe essere inefficiente. Invece la gestione temporanea in SQL Azure consentirebbe l'accesso ai dati da più istanze dopo un singolo caricamento. D'altra parte, se l'implementazione è basata su una singola istanza con un set di dati limitato, il caricamento in memoria potrebbe essere sufficiente. Proverò prima l'opzione di memoria e poi passerò alle opzioni SQL se questo non funziona fino alle aspettative. – hocho

2

Perché non eseguire tutto questo in .net utilizzando un elenco.

Per questo tipo di applicazione, avrei pensato che SQL Azure sarebbe stato più appropriato.

+0

Nel caso della lista dei desideri, un elenco/IEnumerable può essere appropriato, ma ho altri schermi simili dove potrebbero esserci 1000 di risultati.Non voglio dover fare tutto ciò in memoria. Sto usando il Table Storage a favore di SQL Azure in questo caso a causa dei vantaggi economici. – s1mm0t

+0

La memoria per 1000 righe non è molto. Inoltre, quando determini il vantaggio in termini di costi, devi pensare al tuo tempo. Se si desidera risparmiare un'ora o più al mese dall'utilizzo di SQL Azure, è molto più conveniente utilizzare SQL Azure. A meno che non si abbia a che fare con dati BIG e intendo enormi, i vantaggi in termini di costi dell'archiviazione della tabella su SQL Azure non sono equivalenti. –

+0

Ti ho dato un plus +1. Non si tratta sempre di costi o dimensioni. Per un'applicazione multi-tenant in cui si desidera separare i dati creando una tabella di archiviazione è più facile e più veloce rispetto alla creazione del database. – Paparazzi

-1

Qualcosa di simile ha funzionato bene per me:

List<TableEntityType> rawData = 
    (from c in ctx.CreateQuery<TableEntityType>("insysdata") 
    where ((c.PartitionKey == "PartitionKey") && (c.Field == fieldvalue)) 
    select c).AsTableServiceQuery().ToList(); 
List<TableEntityType> sortedData = rawData.OrderBy(c => c.DateTime).ToList(); 
+5

Questo ordinerà le righe in memoria – BritishDeveloper

+0

Questo ignora la domanda originale compreso il paging in ambito, non solo l'ordinamento. –

0

Azure mantiene entità in ordine lessicografico, indicizzate da chiave di partizione come indice primario e chiave Row come indice secondario. In generale, per il tuo scenario sembra che UserId sia adatto per una chiave di partizione, quindi devi ottimizzare la chiave di riga per ogni query.

Se si desidera che l'utente visualizzi l'elenco dei desideri più in alto, è possibile utilizzare il modello di coda del registro in cui la chiave della riga sarà la data invertita della data dell'ora in cui l'utente ha inserito la lista dei desideri. https://docs.microsoft.com/en-us/azure/storage/storage-table-design-guide#log-tail-pattern

Se si desidera all'utente di vedere i loro liste dei desideri ordinato dal nome della voce si potrebbe avere il nome della voce come chiave di fila, e così le entità, naturalmente, ordinati per azzurro.

Quando si scrivono i dati, è possibile denormalizzare i dati ed eseguire più scritture con questi schemi di chiavi di riga differenti. Poiché si avrà la stessa chiave di partizione dell'ID utente, è possibile in quella fase eseguire un'operazione di inserimento in batch e non preoccuparsi della coerenza poiché le operazioni di batch di tabelle azzurre sono atomiche.

Per differenziare i diversi schemi di riga di comando, è possibile anteporre ciascuno a un valore di stringa const. Ad esempio, il valore della chiave della riga di spunta invertita non è simile a "InvertedTicks_ [InvertedDateTimeTicksOfTheWishList]" e il valore della chiave della riga dei nomi oggetto sarebbe "ItemName_ [ItemNameOfTheWishList]"

Problemi correlati