La mia applicazione ha utenti e annunci. Un utente ha un'e-mail univoca. Un annuncio appartiene a un utente (quindi, la tabella ads
ha un FK user_id, che è semplice). Ogni annuncio può anche avere più e-mail e numeri di telefono associati ad esso come un modo per contattare il proprietario. Infine, l'utente deve ricordare tutti i suoi used_emails
e used_phone_numbers
, anche da annunci cancellati, che verranno utilizzati per fornire suggerimenti durante la creazione di un nuovo annuncio. Inoltre, un numero di telefono deve essere memorizzato come due attributi: country_code
e number
.
Il mio primo tentativo (omettendo tutti i campi che non sono collegati al problema):
- tabella utenti: email_id (indice univoco) (ma può anche essere una stringa semplice)
- tabella email: indirizzo (indice univoco)
- tabella phone_numbers: country_code, numero (indice univoco su una combinazione di entrambi i campi)
- 4 tabelle di join (2 tra
ads
eemails
/phone_numbers
e 2 per gli utenti allo stesso modo)
Problemi con questa soluzione: le e-mail e i numeri di telefono sono unici, ma piuttosto dovrebbero essere trattati come record diversi con gli stessi dati. Ad esempio, ad1
e ad2
hanno entrambi un'e-mail [email protected]
. Se il record è aggiornato a [email protected]
, l'aggiornamento in tale design viene propagato a entrambi gli annunci (e anche ai loro utenti) ma non dovrebbe.
La soluzione possibile è rimuovere indici univoci. Ma allora il comportamento descritto sopra sarebbe ancora possibile. Un'altra soluzione a cui posso pensare è creare tabelle separate, qualcosa come ad_phone_numbers
e user_used_phone_numbers
, ma lo svantaggio è lo schema duplicato. Ci sono molte altre combinazioni nella mia testa, ma nessuna di esse sembra corretta. E sto anche usando Postgres quindi un'altra opzione è usare array di stringhe per e-mail e array di hstores per i numeri di telefono, ma è meno severo.
Quale sarebbe la migliore soluzione a questo problema?