Astrazione dal database: gestione dei tipi di ID

0

Sto utilizzando MongoDB in un progetto, in cui le relazioni tra le raccolte vengono create facendo riferimento a un ID documento univoco di un tipo ObjectID BSON speciale.

Quindi posso avere un documento School come questo:

{ name : 'Country School', _id : ObjectId("aaaaaaaaaaaaaa") }

Inoltre, posso avere un documento Oggetto come questo:

{ name: 'Maths', _id : ObjectId("yyyyyyyyyyyyy") }

E poi Documento insegnante nella raccolta Insegnanti:

{ name "Mr Brown", school: ObjectID("aaaaaaaaaaaaaa"), subject:  ObjectId("yyyyyyyyyyyyy") }

I problemi iniziano quando ho bisogno di aggiornare il documento Insegnante in Visualizza:

  • In che modo il controller deve restituire l'oggetto Insegnante alla vista?

Chiaramente, per facilitare un livello di astrazione dal DB, ho bisogno di convertire questo ObjectID in una stringa. Diventa un po 'un casino quando Teacher ha molte proprietà che sono essenzialmente ObjectID: ogni volta che vado avanti e indietro tra View e Controller, alla fine ho bisogno di un codice su misura per convertire ciascuna di queste proprietà in ObjectID e tornare alla stringa.

Quando vai da "Controller" - > "Visualizza" Posso facilmente controllare quali campi hanno tipo "ObjectId" e convertirli in stringa. Ma quando andrò "View" - > "Controller", è l'unica soluzione per l'hard-code su quali campi dovrebbero diventare ObjectId? Forse in qualche modo includere un riferimento al tipo di campo nel nome del campo, ad esempio se il nome del file è 'school_objectid' - convertirlo.

C'è una soluzione elegante a questo problema?

    
posta Tony Sepia 17.03.2017 - 18:51
fonte

2 risposte

1

Forse dovresti considerare di non fare riferimento all'ID oggetto nel tuo codice?

Ma la radice del tuo problema è, sembra che tu stia cercando di usare MongoDB come se fosse un database relazionale.

In mongo, le tue entità sono più o meno supposte di stare da sole.

Inoltre, dalla tua applicazione, dovresti cercare le cose con la loro chiave naturale (o almeno una chiave del livello dell'applicazione, forse una guida) ... Spero che nessuno prenda questo suggerimento come contrario alle chiavi surrogate, niente è più lontano da una verità. Le chiavi surrogate sono ottime, ma anche migliori se usate in combinazione con i tasti naturali.

    
risposta data 20.07.2017 - 22:31
fonte
0

La soluzione migliore a cui potrei arrivare dopo un po 'di ricerca è creare definizioni di classe per oggetti che sono essenzialmente restituiti dal database.

  • aggiungi loro due costruttori: uno che accetta l'entità che il driver del database restituisce e uno che accetta JSON restituito dal front-end web.
  • Quindi aggiungi un metodo che restituisce un'istanza dell'oggetto con tutti i campi ID BSON come stringhe (da utilizzare nel front-end Web) e uno che li restituisce così come sono (di tipo ObjectID) da utilizzare con il DB driver.

Sarebbe interessante vedere quale approccio avrebbe dovuto utilizzare gli architetti di software

    
risposta data 22.03.2017 - 19:42
fonte

Leggi altre domande sui tag