Stiamo costruendo API che principalmente trasferisce gli oggetti del database avanti e indietro tra utente e database, quindi il flusso principale di informazioni è piuttosto semplice:
Table (view) <-- ORM --> C#/Java/etc. Objects <-- JSON serializer --> JSON objects <-- HTTP --> User
Stiamo utilizzando ASP.NET Core con Entity Framework Core se è importante, ma credo che questa sia una domanda agnostica almeno in qualche modo tecnologica.
La maggior parte dei nostri oggetti di back-end mappati dal DB contengono molte proprietà opzionali, il che significa che sono annullabili nel database. Ovviamente, ciò implicherebbe che tali proprietà dovrebbero anche essere Nullable / Optional / WhateverInYourLanguage nel mondo orientato agli oggetti.
Ora il problema sorge quando l'utente vorrebbe impostare una proprietà esistente di qualche oggetto su null. Potremmo quindi ricevere magari seguendo il tipo di aggiornamento JSON da parte dell'utente (molti dettagli omessi e la struttura è stupida, non importa di quello):
{
"TargetType": "Foo",
"Id": 65,
"NullableProperty": null
}
Quindi l'utente vorrebbe impostare il valore della proprietà NullableProperty
su null
per un oggetto con il tipo di Foo
e con Id
di 65
. Tutto bene e bene finora.
In primo luogo, stavamo pensando di generare un oggetto di tipo Foo
da JSON ricevuto e di aggiornare l'oggetto di database esistente con quello, ma questo porterebbe a una situazione in cui tutte le proprietà dell'oggetto creato sarebbero nulle, quindi come faremmo sapere quali proprietà aggiornare?
Forse un'altra soluzione potrebbe avere una funzione di aggiornamento che avrebbe tutti i parametri di proprietà facoltativi impostati su null, ma questo porterebbe allo stesso problema, significherebbe che il valore per quella proprietà non è stato fornito o il valore nullo fornito dall'utente?
Quindi abbiamo pensato che l'utente avrebbe dovuto inviare un intero oggetto dati tramite json, che avrebbe contenuto tutti i valori necessari e sarebbe stato semplicemente copiato sull'oggetto del database. Questo non funzionerà per diversi motivi (molte volte gli utenti ricevono solo parti di un oggetto, le dimensioni degli oggetti possono essere piuttosto grandi, c'è il rischio di perdere dati, ecc.)
Un altro modo che non siamo troppo desiderosi di implementare è riservare un valore speciale per indicare null per ogni tipo di dati. Per esempio la data 9999-99-99
potrebbe significare nulla per le date, il numero MinInt
significherebbe nulla per i numeri interi e ""
sarebbe nullo per le stringhe, ecc. Potrebbe funzionare almeno in una certa misura, ma anche ora mi fa rabbrividire a pensarci.
Esiste un buon modello di progettazione per questo tipo di situazioni? Ho dato questo ora un pensiero, ma non riesco a trovare conclusioni migliori di quelle sopra elencate.