2009-09-04 13 views
11

Come un esempio ipotetico, ho un modello TodoItem e un modello TodoList. Un TodoList ha un elenco ordinato di TodoItem e qualsiasi TodoItem può appartenere a qualsiasi numero di TodoList (Molti a molti). Non è necessario archiviare altre informazioni sulla loro relazione diverse dall'ordine di un TodoItem in un TodoList. Qual è il modo migliore per rappresentarlo nell'archivio dati?ElencoProperty of keys vs Many-to-Many in App Engine

Ci sono due modi per implementare questo - dare alla classe ToDoList un ListProperty di db.Key di che fare riferimento al TodoItem di:

class TodoList(db.Model): 
    items = db.ListProperty(db.Key) 

o fare un modello di ListItem che contiene anche informazioni per gli ordini:

class TodoListItem(db.Model): 
    item = db.ReferenceProperty(TodoItem) 
    list = db.ReferenceProperty(TodoList) 
    order = db.IntegerProperty() 

Io sicuramente lo ottimizzerò più tardi denormalizzando i modelli, ma pre-ottimizzazione, una qualsiasi rappresentazione ha un vantaggio rispetto all'altra?

risposta

10

Questo dipende da alcuni fattori:

  • Avete bisogno di memorizzare le informazioni sul rapporto stesso, diverso dal suo scopo? Ad esempio, molti: molti tra ordini e prodotti dovrebbero memorizzare la quantità di ciascun prodotto.
  • È necessario associare più di un migliaio di elementi sul lato della relazione con la cardinalità "minore" (ad es.,> 1000 elementi todo o> 1000 elenchi per un articolo)?
  • In genere si desidera recuperare tutti gli elementi associati contemporaneamente o si desidera essere più selettivi?

Se hai bisogno di ulteriori informazioni, o se hai molti elementi nella tua associazione, o hai solo bisogno di recuperarne alcuni, l'entità della relazione è probabilmente una scelta migliore. In altre situazioni, l'elenco può essere sia più facile che più veloce. Nel caso di una lista di cose da fare, direi che un elenco di chiavi è sicuramente il modo migliore per andare.

1

Tranne che in un contesto relazionale in cui si sta spingendo per la normalizzazione (molto consigliabile nel caso relazionale, ovviamente!) La "classe di relazione" TodoListItem separata mi sembra un po 'eccessiva e un po' "truccata" in termini del modo in cui uno ragiona sul problema rispetto al modo in cui lo si codifica. Per quanto riguarda l'ottimizzazione, sarebbe certamente più facile trovare tutte le liste su cui è presente un articolo.

0

Dato che TodoListItem può appartenere a più TodoList, sarei preoccupato che sarebbe valido avere una singola proprietà di ordine che funzionerebbe per ogni elenco a cui appartiene l'elemento. Penserei che l'articolo avrebbe bisogno di un ordine per ogni lista a cui appartiene.