Domanda

Mi chiedo se qualcuno possa fornire alcuni consigli concettuali su un modo efficiente per costruire un modello di dati per realizzare il semplice sistema descritto di seguito. Sono in qualche modo nuovo a pensare in modo non relazionale e voglio provare a evitare eventuali insidie. Comprendo che un principio di base è che "l'archiviazione è economica, non preoccuparti della duplicazione dei dati" come si potrebbe in un RDBMS normalizzato.

Quello che vorrei modellare è:

Un articolo di blog a cui possono essere assegnati tag 0-n. Molti articoli del blog possono condividere lo stesso tag. Quando si recuperano dati, si desidera consentire il recupero di tutti gli articoli corrispondenti a un tag. Per molti aspetti molto simile all'approccio adottato qui su StackOverflow.

La mia mentalità normale sarebbe quella di creare una relazione molti-a-maggio tra tag e articoli del blog. Tuttavia, sto pensando nel contesto di GAE che questo sarebbe costoso, anche se ne ho visti degli esempi.

Forse stai usando un ListProperty che contiene ogni tag come parte delle entità dell'articolo e un secondo modello di dati per tenere traccia dei tag mentre vengono aggiunti ed eliminati? In questo modo non sono necessarie relazioni e ListProperty consente comunque query in cui qualsiasi corrispondenza dell'elemento elenco restituirà risultati.

Qualche suggerimento sul modo più efficace per affrontarlo su GAE?

È stato utile?

Soluzione

Grazie a entrambi per i vostri suggerimenti. Ho implementato (prima iterazione) come segue. Non sono sicuro che sia l'approccio migliore, ma funziona.

Classe A = Articoli. Ha una StringListProperty che può essere interrogata sui suoi elementi di elenco

Classe B = Tag. Un'entità per tag mantiene inoltre un conteggio progressivo del numero totale di articoli che utilizzano ciascun tag.

Le modifiche dei dati ad A sono accompagnate da lavori di manutenzione su B. Pensare che i conteggi pre-calcolati sia un buon approccio in un ambiente pesante.

Altri suggerimenti

i conteggi pre-calcolati sono non solo pratico , ma anche necessario perché la funzione count () restituisce un massimo di 1000 . se la contesa in scrittura potrebbe essere un problema, assicurati di dare un'occhiata al contatore esempio.

http://code.google.com/appengine/articles/sharding_counters.html

Suoni molti a molti ragionevoli. Forse dovresti provarlo prima per vedere se è effettivamente costoso.

L'aspetto positivo di G.A.E. è che ti dirà quando stai usando troppi cicli. Profilazione gratuita!

Un modo possibile è con Expando , dove aggiungere un tag come:

setattr(entity, 'tag_'+tag_name, True)

Quindi puoi interrogare tutte le entità con un tag come:

def get_all_with_tag(model_class, tag):
    return model_class.all().filter('tag_%s =' % tag, True)

Ovviamente devi ripulire i tuoi tag per essere corretti identificatori Python. Non l'ho provato, quindi non sono sicuro che sia davvero una buona soluzione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top