Contesto
Sto progettando un database che, semplificato, dovrebbe essere in grado di gestire gli utenti che inviano richieste di lavoro a vicenda e, successivamente, un lavoro può essere avviato, completato e rivisto. Il design dovrebbe essere scalabile (pensa a milioni di utenti).
Approcci che ho considerato:
Tavola gigantesca
Un approccio, probabilmente non il migliore, sarebbe semplicemente archiviare TUTTI i lavori in una tabella enorme jobs
. Questa tabella richiede una colonna state
per rappresentare lo stato in cui si trova attualmente il lavoro (ad esempio ACCEPTED
, STARTED
, FINISHED
, REVIEWED
e.t.c.). Il problema più grande con questo approccio che posso vedere è che i lavori in diversi stati hanno diversi tipi di dati che sono rilevanti per loro. Ad esempio, una richiesta di lavoro ha un prezzo concordato preliminare, ma potrebbe cambiare prima che il lavoro venga avviato e cambiare nuovamente prima che il lavoro sia terminato. Questo potrebbe naturalmente essere risolto aggiungendo semplicemente più colonne alla tabella e assegnandole un nome appropriato, ma probabilmente diventerà un enorme collo di bottiglia, molto presto per avere una tabella contenente tutti i diversi tipi di dati possibili per tutti i diversi stati possibili di un lavoro.
Tabelle diverse per stati diversi
Questo approccio sarebbe avere più tabelle, ad esempio job_requests
, jobs_started
, jobs_finished
, tabelle che a loro volta possono avere sottostati, ad es. job_requests
potrebbe avere i sotto-stati PENDING
, ACCEPTED
, mentre la tabella jobs_finished
avrebbe i sottoambieri COMPLETED
, CANCELLED
, REVIEWED
.
Con questo approccio ogni tabella contiene solo dati rilevanti per lo stato corrente del lavoro, ma d'altra parte alcuni dati potrebbero essere duplicati (ad esempio gli ID utente del richiedente lavoro e il destinatario del lavoro - d'altro canto questa informazione potrebbe essere memorizzata in un'altra tabella?).
Il problema con questo approccio è che non riesco a pensare a una buona soluzione su come archiviare tutte le informazioni durante la transizione tra stati. Ad esempio, una volta che una richiesta di lavoro è stata accettata e quindi avviata, deve essere eliminata dalla tabella job_requests
e spostata nella tabella jobs_started
, ma è solo una questione di tempo prima che uno stakeholder voglia sapere, ad esempio, come a lungo il tempo medio è tra una richiesta di lavoro che viene creata, fino a quando non è stata avviata, a quel punto avrei bisogno dei dati dalla tabella job_requests per essere in grado di calcolarlo.
Sembra che questo tipo di problema debba essere facile da risolvere, ma non riesco davvero a pensare a nessuna buona soluzione che "si senta a posto", qualsiasi soluzione mi venga in mente mi sembra brutta e posso immediatamente pensare a un certo numero di cose che rendono la soluzione cattiva.
Molto grato per qualsiasi feedback o consiglio sugli approcci che potrei prendere. Grazie in anticipo!