Sto ancora imparando le mie lezioni sulla modellazione dei dati in bigtable/nosql e apprezzerei qualche feedback. Sarebbe corretto dire che dovrei evitare le relazioni genitore-> figlio nella mia modellazione dei dati se ho spesso bisogno di trattare i bambini in modo aggregato tra i genitori?parent-> relazioni figlio in appengine python (bigtable)
Ad esempio, diciamo che sto costruendo un blog a cui un certo numero di autori darà il proprio contributo e che l'un l'altro ha post e ogni post ha tag. Quindi potrei potenzialmente impostare qualcosa del genere:
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
tags = db.StringListProperty()
Come ho capito questo creerà un gruppo di entità basato sull'autore padre. Ciò causa inefficienza se per lo più ho bisogno di interrogare i Post per tag che mi aspetto di tagliare su più Autori?
Capisco che fare una query sulle proprietà dell'elenco può essere inefficiente. Diciamo che ogni post ha in media circa 3 tag, ma potrebbe arrivare fino a 7. E mi aspetto che la mia collezione di tag possibili sia tra le poche centinaia. C'è qualche vantaggio nel modificare quel modello in qualcosa del genere?
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
tags = db.ListProperty(db.Key)
class Tag(db.Model):
name = db.StringProperty()
O sarei meglio fare qualcosa di simile?
class Author(db.Model):
owner = db.UserProperty()
class Post(db.Model):
owner = db.ReferenceProperty(Author,
collection_name='posts')
class Tag(db.Model):
name = db.StringProperty()
class PostTag(db.Model):
post = db.ReferenceProperty(Post,
collection_name='posts')
tag = db.ReferenceProperty(Tag,
collection_name='tags')
E ultima domanda ... cosa succede se il mio caso d'uso più comune sarà query per i messaggi di più tag. Ad esempio, "trova tutti i post con tag in {'mele', 'arance', 'cetrioli', 'biciclette'}" Uno di questi approcci è più appropriato per una query che cerca post che abbiano una qualsiasi raccolta di tag ?
Grazie, so che era un boccone. :-)
Nessuno dei vostri esempi crea gruppi di entità. Nel primo esempio, stai usando una Reference Reference, che crea un riferimento all'altra entità - questa è mutabile e non implica la proprietà. I riferimenti principali vengono creati specificando l'argomento "principale" per il costruttore per l'entità: consultare questa pagina per i dettagli: http://code.google.com/appengine/docs/python/datastore/entities.html#Entity_Groups_and_Ancestor_Paths –
Ah, grazie Nick. Mi mancava quella parte ... pensavo che fossero i riferimenti a creare la relazione genitore e mancava il fatto che era necessario passare il genitore al costruttore. Questo ha senso ora. –