2012-10-10 8 views
7

Ho un utente tavolo:Tabella disegno consiglio

user_id - name 

E gli utenti possono creare un articolo e poi condividerlo con gli altri membri, articoli da tavola:

article_id - user_id - article_name 

la domanda è il modo migliore condividerlo ... sto pensando un altro article_shares tavolo:

share_id - article_id - user_id 

Questo sarebbe semplicemente elencare tutti gli utenti con accesso a tale Aerticle e il creatore avrebbero avuto la possibilità di aggiungere o cancellare da quella tabella per l'articolo che hanno creato

Quindi, quando l'autore dell'articolo (user_id 123) guarda i suoi articoli può vedere una lista di tutti gli altri utenti che ha ha condiviso ogni articolo con

select as.user_id, a.article_name from article_shares as 
join users u on u.user_id = as.user_id 
join articles a on a.article_id = as.article_id where u.user_id = '123' 

e un utente (user_id 456) in grado di visualizzare un elenco di articoli che sono stati condivisi

select a.article_name from articles a 
join article_shares as on as.article_id = a.article_id 
where as.user_id = '456' 

Vi sembra logico? Sono sulla buona strada?

Grazie per qualsiasi aiuto

+3

mi sembra ok. Hai bisogno di un modo per mettere in relazione gli articoli condivisi con gli utenti che possono vederli, non riesco a pensare a un modo più semplice. – Jay

+0

@Jay Grazie, mi sono insegnato solo a unirmi due giorni fa quindi grazie per aver dedicato del tempo per dare un'occhiata! –

+0

Sei sulla strada giusta. Una volta che hai familiarizzato con l'uso di JOIN, e tutte le sue forme (INTERNE, SINISTICHE, ecc.) Potresti sentire che non c'è nulla che tu non possa fare! :) –

risposta

1

Hai capito bene. Se sei curioso, hai creato uno junction table per creare la tua relazione molti-a-molti tra users e articles, e questo è abbastanza standard.

Vedrete spesso questi tipi di tabelle denominate come ArticlesToUsers o qualcosa di simile, e questo a volte sarà il primo modo per soffiarvi che state guardando una tabella di congiunzione. Ovviamente, gli schemi di denominazione sono piuttosto soggettivi, quindi non sentire la necessità di cambiare il nome. article_shares mi sembra una buona descrizione.

Come ha dimostrato @MaxVT, molti sviluppatori non metteranno uno surrogate key su una tabella di giunzione come questa, e preferirebbero semplicemente utilizzare entrambe le colonne come chiave primaria (article_id, user_id). La scelta è ovviamente tua e potrebbe avere più a che fare con il rimanere coerente con il resto delle tabelle del database, anche se sicuramente vedrai tutte le permutazioni in the wild. Nel caso in cui si mantenga la chiave surrogata, raccomanderei comunque un vincolo univoco di article_id, user_id per eliminare i duplicati (perché un articolo deve essere condiviso due volte per un utente?).

+0

Grazie Tim, apprezzo quel consiglio! –