Impostazioni
(schema semplificato per chiarezza)
Supponiamo che abbia una tabella chiamata resource
:
+---------------+--------------+------+-----+
| Field | Type | Null | Key |
+---------------+--------------+------+-----+
| id | int(11) | NO | PRI |
| name | varchar(255) | NO | |
| owner_id | int(11) | NO | |
+---------------+--------------+------+-----+
Ogni record di risorse è "posseduto" da un utente definito nella tabella user
:
+---------------+--------------+------+-----+
| Field | Type | Null | Key |
+---------------+--------------+------+-----+
| id | int(11) | NO | PRI |
| name | varchar(255) | NO | |
+---------------+--------------+------+-----+
Una proprietà delle risorse può essere trasferita ad altri utenti con due metodi diversi:
- un proprietario di risorse può richiedere che un altro utente assuma la proprietà della risorsa e la proprietà viene trasferita non appena l'utente accetta la proprietà.
- Un utente può richiedere la proprietà dal proprietario corrente di una risorsa, la proprietà viene trasferita non appena il proprietario corrente accetta la richiesta.
In entrambi i casi se la richiesta viene rifiutata dal responsabile dell'approvazione, di quanto non sia stato fatto nulla.
La mia ingenua implementazione delle tabelle necessarie per implementare questi concetti.
transferOwnershipRequest
+------------------------+--------------+------+-----+
| Field | Type | Null | Key |
+------------------------+--------------+------+-----+
| id | int(11) | NO | PRI |
| resource_id | int(11) | NO | |
| requested_by_owner_id | int(11) | NO | |
| approver_owner_id | int(11) | NO | |
| requested_new_owner_id | int(11) | NO | |
| status_id | int(11) | NO | |
+------------------------+--------------+------+-----+
transferOwnershipRequestStatus
+---------------+--------------+------+-----+
| Field | Type | Null | Key |
+---------------+--------------+------+-----+
| id | int(11) | NO | PRI |
| status | varchar(10) | NO | |
+---------------+--------------+------+-----+
// status example data
+----+----------+
| id | status |
+----+----------+
| 1 | pending |
| 2 | approved |
| 3 | denied |
+----+----------+
La mia logica aziendale aggiornerebbe transferOwnershipRequest
. status_id
mentre una richiesta si fa strada attraverso il processo di approvazione.
problema
Vedo immediatamente più problemi con questa implementazione.
- Non c'è modo di tenere traccia delle variazioni di proprietà nel tempo.
- I campi di timestamp in
transferOwnershipRequest
(comelast_updated
,request_time
,approver_response_time
ecc.) sono macchinosi - Qualsiasi tipo di funzionalità di fallback (come tornare a un proprietario precedente se il proprietario corrente è investito da un bus) sarebbe difficile da implementare.
Domanda
Quali sono le mie opzioni per quanto riguarda i modelli di progettazione di database relazionali per questo tipo di situazione? Hai implementato qualcosa di simile a questo?