2011-11-21 22 views
6

Tengo una pregunta básica sobre dónde debo insertar una colección de seguidores/seguidores en un mongo db. Tiene sentido tener una colección incrustada de seguidores en un objeto de usuario, pero ¿también tiene sentido incluir también la colección de seguidores conversos? Eso significaría que tendría que actualizar e insertar en el registro de perfil tanto de la:mongo db diseño de seguimiento y feeds, ¿dónde debo incrustar?

  1. siguiente lista incrustado en el seguidor
  2. Y los seguidores lista incrustado de la followee

lo que pueda' Aseguro la atomicidad sobre eso a menos que también de alguna manera mantenga una transacción o un estado de actualización en alguna parte. ¿Vale la pena incluirlo en ambas entidades o debería simplemente actualizar el n. ° 1, insertar el siguiente en el perfil del seguidor y ponerle un índice para que pueda consultar a los conversos en todos los perfiles? ¿El rendimiento se ve afectado demasiado?

¿Es esto un candidato para una colección que no debería incrustarse? ¿Debo tener una colección de bordes donde almaceno los siguientes en su propia colección con followerid y seguido de Id?

Ahora, si también tengo que actualizar un feed para ambos usuarios cuando se siguen o siguen, ¿cómo debo organizar eso?

En cuanto al caso de uso, el usuario verá a las personas que están siguiendo cuando ven sus feeds, lo que sucede bastante a menudo, y también ve a los seguidores de un perfil cuando ven los detalles del perfil de cualquier persona, lo que también sucede a menudo pero no tanto como el primer caso. En ambos casos, el número total de seguidores y seguidores aparece en cada página de perfil.

Respuesta

11

En general, es una mala idea para incrustar siguiente/seguida por las relaciones en los documentos del usuario, por varias razones:

(1) hay un límite de tamaño máximo de documentos de 16 MB, y es plausible que un popular el usuario de un sitio bien suscrito podría terminar con cientos de miles de seguidores, que se acercarán al tamaño máximo de documento,

(2) las relaciones de seguidores cambian con frecuencia, por lo que el caso en el que un usuario gana muchos seguidores se traduce en crecimiento de documentos repetidos si está incorporando seguidores. El crecimiento frecuente de documentos obstaculizará significativamente el rendimiento de MongoDB, por lo que debe evitarse (el crecimiento ocasional de documentos, especialmente si los documentos tienden a alcanzar un tamaño final estable, es una penalización menor al rendimiento).

Entonces, sí, es mejor dividir la relación siguiente/seguida en una colección separada de registros, cada uno con dos campos, por ejemplo, {_id:, oid:}, con índices en _id (para el "quién ¿sigo? "consulta) y oid (para la consulta" ¿quién me está siguiendo? "). Cualquier cambio de estado individual se modela mediante la adición o eliminación de un único documento, aunque si también está visualizando cosas como recuentos de seguidores, probablemente deba mantener contadores separados que actualice después de cualquier inserción/eliminación de bordes.

(Por supuesto, esto supone que sus requisitos comerciales le permiten cierta flexibilidad en los detalles de coherencia: en general, si su código de visualización le dice a un usuario que tiene 304 seguidores y luego procede a enumerarlos, solo el usuario más exigente comprobará que los seguidores enumeraron hasta 304. Si los requisitos del negocio requieren consistencia absoluta, necesitará una base de datos que aísle las transacciones, o tendrá que contar usted mismo como parte de mostrar todas las identidades de usuario).

+1

A pesar de ser de naturaleza muy relacional, estoy totalmente de acuerdo con su interpretación.Este es uno de esos lugares donde las relaciones tienen mucho sentido, y de esta manera no se terminan con las penalizaciones de rendimiento. –

+0

¿esto también se aplicaría a los "me gusta"? El ejemplo de votación en el sitio web de mongo incluye los "Me gusta" en el documento, pero parece que se puede hacer la misma línea de razonamiento tanto para los "me gusta" como para los "siguientes". – MonkeyBonkey

+0

@MonkeyBonkey: este enfoque podría usarse también para "Me gusta", pero lo más probable es que solo desee 1 de los índices. La ventaja de incluirlo en un escenario de "Me gusta" es que puede mantener un recuento exacto de "personas que leen" utilizando el operador $ inc. Además, esto depende del sitio, por supuesto, pero es probable que la cantidad de personas a las que les gusta una sola publicación nunca llegue al mismo nivel que el número de seguidores para un usuario de alto tráfico, por lo que el peor de los casos probablemente sea menos crítico. – mpobrien