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
adseemails/phone_numberse 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?