Tabella consigliato Impostare per uno a molti / molti a uno situazione
-
06-09-2019 - |
Domanda
Ho bisogno di creare uno script in cui qualcuno pubblicherà un'apertura per una posizione, e chiunque ha diritto vedrà l'apertura, ma chi non è (o opta out) non vedrà l'apertura. Così due persone potevano andare alla stessa pagina e vedere contenuti diversi, alcuni potenzialmente lo stesso, alcuni assolutamente unico. Non sono sicuro che il modo migliore per organizzare i dati in un DB MySQL / tavola.
Per esempio, avrei potuto è organizzato dal distacco, ma che sarebbe guardare un po 'come:
PostID VisibleTo
PostingA user1,user2
E che sembra sbagliato (lo stile CSV nella colonna). Oppure potrei andare con per persona:
User VisiblePosts
user1 posting1, posting2
Ma è lo stesso problema. C'è un modo per rendere l'utente unico, unico distacco, e li hanno unirsi solo se corrispondono?
La decisione è inizialmente fatta facendo una serie di domande a un'altra serie di tabelle, ma una volta che viene eseguito, sembra inefficiente avere che qualche pezzo di codice eseguito di nuovo e di nuovo quando non cambierà dopo che i messaggi degli utenti la posizione.
... A pensarci bene, potrebbe cambiare, ma se assumiamo che non (come è improbabile, e come poca importanza se un utente vede qualcosa che non sono più ammissibili per lo sono), c'è uno standard soluzione per questo scenario?
Soluzione
Questa è una relazione molti-a-molti o n. M rapporto
Si potrebbe creare una tabella aggiuntiva, dire PostVisibility
, con una colonna e PostID
UserID
. Se è presente nella tabella una combinazione di PostID
e UserID
, che post è visibile all'utente.
Altri suggerimenti
Tre tavoli ...
Utente: [ID utente] [OtherField]
Messaggio: [PostID] [OtherFields]
UserPost: [ID utente] [PostID]
User.UserId unisce alla UserPost.UserId, Post.PostId entra a far parte di UserPost.PostId
Poi cercare il tavolo UserPost, unendo alla Posta quando si selezionano quali post da mostrare
Modifica: Ci dispiace, penso che si sta parlando in termini Distacco-utente, che è molti-a-molti. Stavo pensando di questo in termini di termini posting- "i diritti di visione", che è uno-a-molti.
A meno che non mi manca qualcosa, questa è una situazione uno-a-molti, che richiede due tavoli. Per esempio, ogni registrazione ha n utenti che possono visualizzarlo. Commenti sono unici per un singolo utente, in modo da non c'è bisogno di fare il contrario.
-
PostingTable con IDannuncio (e altri dati)
-
PostingVisibilityTable con IDannuncio e UserID
-
usertable con i dati UserID e degli utenti
Crea i messaggi indipendentemente dai loro diritti di visibilità, e poi separatamente aggiungere / rimuovere le coppie / UserID IDannuncio contro il tavolo visibilità.
Per selezionare tutti i messaggi visibili per l'utente corrente:
SELECT * FROM PostingTable A INNER JOIN PostingVisibilityTable B ON A.PostingID = B.PostingID WHERE B.UserID = "currentUserID"