2011-07-11 19 views
13

Estoy tratando de determinar el mejor diseño de tabla para una función de "seguir/no seguir usuario", similar a Twitter (Editar: No estoy haciendo una aplicación como Twitter). Debajo está mi el diseño actual de la tabla y el manejo de php. No estoy seguro de si es el mejor enfoque y realmente agradecería sus comentarios.Diseño de tabla de base de datos "Seguir usuario"

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 ; 

En el seguimiento, se añade el ID seguidores al campo follower y el ID del usuario que será seguido se añade a following. También estoy registrando la fecha en que un usuario se suscribió para seguir a otro usuario en el campo subscribed. La fecha de suscripción se puede usar para clasificar.

Cuando un usuario deja de seguir, simplemente borro la fila respectiva.

Para evitar filas duplicadas hice las columnas follower y following únicas. Si un usuario ya está siguiendo un id y hace clic para seguir de nuevo, me sale error de base de datos de 1062. Por ejemplo

Entrada duplicada '62 -88' para la llave 'follow_unique'

Obviamente, cuando ya siguiente un usuario, el seguidor ve un botón unfollow. Esto se logra al verificar si existe una fila de tabla seguidora de seguidor entre 2 usuarios. Si rows > 0 visualizo unfollow de lo contrario follow.

Bueno, ¿qué opinas?

+3

No estoy tratando de recrear Twitter ... Es para un propósito totalmente diferente pero tiene la misma funcionalidad que Twitter en términos de suscripciones – CyberJunkie

+2

Suena bien, pero agregaría (si no lo has hecho ya) las restricciones de Foreign Keys en 'follower' y' following' a su tabla de Usuarios. – Dirk

+2

Lo que estás haciendo me parece bien. Sugeriría usar 'ENGINE = InnoDB' en lugar de' MyISAM', para que pueda aplicar las relaciones 'FOREIGN KEY' y' ON DELETE/UPDATE'. Sin embargo, es probable que esto requiera que los cambios de motor en muchas de sus tablas sean efectivos. –

Respuesta

7

Creo que es un muy buen diseño, y debe satisfacer sus necesidades. Una cosa; probablemente deba hacer las claves externas follower y following. Ah, y para simplificar, haría la columna subscribedTIMESTAMP DEFAULT CURRENT_TIMESTAMP solo para capturar la fecha y hora en que el usuario se suscribió.

+0

¡Gracias! Con las restricciones de Llaves extranjeras, te refieres a identificadores únicos para seguidores y seguidores, ¿no? Si es así, lo son. – CyberJunkie

+4

@CyberJunkie por restricciones de clave externa, significan cambiar sus tablas al motor alternativo de tabla mysql, innodb, que permite claves externas. estas restricciones hacen que, por ejemplo, si eliminara un registro de usuario y existieran registros en otras tablas conectados por clave externa, esos registros también se eliminarían, evitando así los registros huérfanos. también funciona para las actualizaciones. se puede configurar en phpMyAdmin. http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html – dqhendricks

+0

¡Gracias por la aclaración! No estaba al tanto de esta característica, ¡definitivamente voy a mirar más en ella! – CyberJunkie

3

Le sugiero que haga seguidor y que sigan juntos la clave principal. No hay necesidad de un campo separado id.

+0

Me han informado esto anteriormente, pero por alguna razón me parece "hacky", y tampoco puedo hacer las dos primarias. Me sale un error o no pasa nada. Además, quiero un A.I.clave primaria única. Es una base de datos estándar. No quiero sonar desdeñoso, simplemente no sé mucho sobre este enfoque – CyberJunkie

Cuestiones relacionadas