Supponiamo di avere un CRUD molto semplice in cui stai semplicemente memorizzando un semplice tipo di dati simile a una tupla, ma la sua chiave primaria naturale è ingombrante da ricordare (molto lunga, difficile da scrivere, ecc.). Inoltre, supponiamo che voglio consentire agli utenti di fare riferimento ai record usando un handle come un valore intero autoincrementato (che fungerà quindi da chiave primaria, ma è surrogato, piuttosto che naturale ).
Creano i record senza specificare l'handle, ma, quando richiedono una lista di tutti i record, voglio dare loro i record con l'handle ad essi collegato, in modo che possano poi facilmente riferirsi a loro.
Se, nella mia applicazione, il record è rappresentato come un oggetto valore semplice, (che è il proprio DTO), che viene creato e passato al gateway del database e restituito dal gateway del database ... come potrei io correttamente fare anche il ritorno dell'impugnatura?
Non voglio restituire un oggetto diverso (qualcosa come un record decorato con l'handle) durante la lettura dal database, perché ritengo che l'handle sia solo un dettaglio di presentazione richiesto dai requisiti di questa specifica interfaccia utente e potrebbe essere inutile per diverse interfacce utente. Attaccare l'handle all'oggetto record esistente non ha senso perché non fa realmente parte del tipo di dati.
Una cosa che potrei fare è che la presentazione richieda separatamente l'handle di ogni record. Ciò significherebbe due viaggi nel database, ma almeno sarebbe chiaro che l'handle non fa parte del record.
Ma sono positivo, deve esserci un modo migliore. Qualche idea?
Ad esempio
Un catalogo di libri molto semplice. Il dato è Book, che è rappresentato da tuple del modulo (autore, titolo, anno). Supponiamo che (autore, titolo) sia una chiave primaria naturale (in tutto il rigore, potrebbe non essere il caso, ma prendi questo come presupposto del sistema). Ho solo un'interfaccia utente, che è un'interfaccia a riga di comando per il mio sistema. Qui, richiedere agli utenti di fare riferimento ai libri fornendo la chiave primaria naturale (autore, titolo) è ingombrante, quindi decido di collegare ogni record a un numero intero stupido autoincrementato che agirà come una chiave primaria surrogata. In questo modo, gli utenti dell'interfaccia della riga di comando possono fare riferimento ai record tramite il relativo handle di numero intero associato. Questo collegamento può essere implementato come una tabella di associazione sparate che mappa i PK naturali per la sostituzione dei PK.
L'intera implementazione del sistema consiste in un tipo di dati, che può essere un vecchio oggetto semplice tuple / struct / hash / custom e un singolo repository CRUD in cui posso mantenere questi oggetti e leggerli con il loro naturale chiave primaria. Non voglio restituire un oggetto che ha anche un membro 'handle' contenente la sua chiave primaria surrogata associata, poiché i dati non hanno nulla a che fare con il resto dei dati e sono solo un requisito dell'interfaccia utente particolare.
Quindi proporrei di avere un metodo sul repository (o un repository diverso del tutto) che mi fornisca le maniglie dei record, fornendo la chiave primaria naturale. Con questo, questa UI specifica userebbe il repository (o quei due repository) per recuperare prima il record e poi recuperare l'handle, in due passaggi.