Come associare dati simili a tabelle diverse in un database?

2

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 e emails / 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?

    
posta user225521 21.04.2016 - 23:01
fonte

1 risposta

1

Probabilmente non avrai bisogno delle tabelle used_emails e used_phone_numbers , poiché puoi sempre ottenere tali informazioni dalla tua tabella degli annunci con una semplice query di selezione separata. In questo caso, utilizzare gli array sarebbe conveniente, dal momento che è sempre possibile utilizzare la stampa in eccesso per produrre record separati.

Per i record separati nel numero di telefono, se dovessi utilizzare i record, potresti utilizzare un tipo composito (ad esempio CREATE TYPE phone_number AS (country_code int, number text) ) o frammentare il telefono in due campi utilizzando regexp_matches (ad esempio regexp_matches(phone, '^ *(\+1|\+[2-9]\d)? *(.*?) *') ).

La tua tabella annunci dovrebbe avere un% booleano deleted (o il campo data / ora), in modo che gli annunci non vengano cancellati ma piuttosto obsoleti, in modo da poter interrogare le informazioni storiche (come e-mail e telefoni usati), ma comunque filtrati quando non necessario.

    
risposta data 22.04.2016 - 07:06
fonte