2011-07-11 8 views
13

Sto cercando di determinare la migliore progettazione di tabella per una funzione "segui/non seguire", simile a Twitter (modifica: Non sto creando un'applicazione simile a Twitter.) Di seguito è riportato il mio attuale design del tavolo e la gestione dei php. Non sono sicuro che sia l'approccio migliore e apprezzerebbe davvero il tuo feedback.Design tabella database "Segui utente"

CREATE TABLE IF NOT EXISTS `user_follow` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `follower` int(11) NOT NULL, 
    `following` int(11) NOT NULL, 
    `subscribed` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `follow_unique` (`follower`,`following`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=76 ; 

In seguito, la seguono id è aggiunto al campo follower e l'ID dell'utente che sarà seguito viene aggiunto following. Sto anche registrando la data in cui un utente si è iscritto per seguire un altro utente nel campo subscribed. La data dell'abbonamento potrebbe essere utilizzata per l'ordinamento.

Quando un utente non esegue la cancellazione, è sufficiente eliminare la riga corrispondente.

Per evitare righe duplicate ho creato le colonne follower e following univoche. Se un utente è già a seguito di un id e scatta a seguire ancora una volta, ottengo l'errore di database 1062. Per esempio

voce duplicata '62 -88' per la chiave 'follow_unique'

Ovviamente quando già dopo un utente, il follower vede un pulsante unfollow. Ciò si ottiene controllando se esiste una riga di tabella che segue un seguace tra 2 utenti. Se rows > 0 visualizzo unfollow altrimenti follow.

Bene, cosa ne pensi?

+3

Non sto tentando di ricreare Twitter .. È per uno scopo completamente diverso ma ha le stesse funzionalità di Twitter in termini di abbonamenti – CyberJunkie

+2

Suona bene, ma vorrei aggiungere (se non lo hai già) vincoli Foreign Keys su 'follower' e' following' sulla tabella Utenti. – Dirk

+2

Quello che stai facendo sembra a mio parere. Ti suggerirei di usare 'ENGINE = InnoDB' piuttosto che' MyISAM', quindi puoi applicare le relazioni 'FOREIGN KEY' e' ON DELETE/UPDATE'. È probabile che ciò richieda tuttavia che le modifiche al motore di molte delle tue tabelle siano efficaci. –

risposta

7

Penso che sia un ottimo design e che soddisfi bene le vostre esigenze. Una cosa; probabilmente dovresti creare le chiavi esterne follower e following. Oh, e per ragioni di semplicità, farei la colonna subscribedTIMESTAMP DEFAULT CURRENT_TIMESTAMP solo per catturare il datetime che l'utente ha sottoscritto.

+0

Grazie! Per vincoli di chiavi esterne intendi ID univoci per follower e seguiti a destra? Se così sono. – CyberJunkie

+4

@CyberJunkie da vincoli di chiave esterna, significano passare le tabelle al motore di tabella mysql alternativo, innodb, che consente chiavi esterne. questi vincoli fanno in modo che, ad esempio, se si cancellasse un record utente e fossero presenti record in altre tabelle collegate da chiave esterna, anche quei record verrebbero eliminati, impedendo in tal modo la creazione di record orfani. funziona anche per gli aggiornamenti. può essere impostato in phpMyAdmin. http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html – dqhendricks

+0

Grazie per il chiarimento! Non ero a conoscenza di questa funzione, sicuramente la guarderò di più! – CyberJunkie

3

Suggerirei di creare follower e di seguire insieme la chiave primaria. Non è necessario un campo separato id.

+0

Mi è stato consigliato questo prima, ma per qualche motivo mi sembra "hacky", anche io non sono in grado di renderlo primario. Ottengo un errore o non succede nulla. Inoltre voglio un A.I.chiave primaria unica. È standard di database. Non intendo sembrare sbrigativo, non so molto di questo approccio – CyberJunkie