Editar para agregar una nota importante: esta respuesta recibió mucha más atención de la que esperaba. Tenga en cuenta que realmente no estoy respondiendo la pregunta sobre cómo Facebook mismo almacena datos de amigos, ya que esta información no es pública. En cambio, estoy respondiendo cómo puedes lograr esto en tu propia aplicación. Consulte algunas de las otras respuestas que contienen información / teoría sobre cómo Facebook podría estar haciéndolo.
Además, tenga en cuenta que el método cubierto en mi respuesta puede no escalar. En mi propia experiencia, el siguiente método ha funcionado bien hasta 15MM de registros en una base de datos MySQL ajustada correctamente (hasta ahora).
Asegúrese de leer las otras respuestas, especialmente la respuesta de Jakub Łopuszański sobre optimizaciones potenciales mediante el uso de dos registros para almacenar la amistad en lugar de uno (si va por la ruta de la base de datos relacional), y los otros con respecto a las bases de datos de gráficos si desea ir a otra camino.
- ¿Cuáles son algunos buenos ejemplos de IA benévola en ciencia ficción?
- Si crearas Inteligencia Artificial General, ¿cómo harías para conquistar el mundo?
- ¿Es posible entrenar a una IA en datos sísmicos para predecir efectivamente los terremotos?
- ¿Hay IA para aprender a leer los labios?
- ¿Qué compañía ofrece la mejor capacitación en inteligencia artificial para una carrera en Jaipur?
Asegúrese de leer también las respuestas / comentarios sobre esta respuesta, ya que hay algunas críticas válidas y enlaces a otras páginas / respuestas que tienen información excelente.
No trabajo para Facebook, sin embargo, puedo decirte que es raro que mantengas una tabla por [cualquier cosa], ya que eso es casi lo contrario de usar una base de datos correctamente.
Tenga en cuenta que realmente no estoy respondiendo la pregunta sobre cómo Facebook mismo almacena datos de amigos, ya que esta información no es pública. En cambio, estoy respondiendo cómo puede lograr esto en su propia aplicación que no necesita escalar a los niveles de Facebook.
Para responder a esta pregunta, abrí MySQL Workbench y modelé un conjunto muy básico de tablas para ayudarlo a visualizar cómo podría mantener esta información.
Primero, necesitas una tabla que represente a una persona. Para los propósitos de este ejemplo, lo mantendremos simple: nombre y apellido. También necesitamos un identificador único que permitiremos que la base de datos se cree automáticamente. En este punto tenemos una estructura de tabla bastante básica:
Hay muchas cosas (o atributos) que componen una persona, y realmente queremos capturar esa información. Por ejemplo, es bastante útil saber cuál es su género. Sin embargo, dado que no queremos permitir que escriban cualquier género antiguo, lo que realmente deberíamos hacer es crear una tabla que tenga una lista de todos los géneros aceptables. Puede pensar que esto es tan simple como masculino / femenino, pero no lo es. Facebook entiende esto y recientemente amplió su lista de género a bastantes opciones. De todos modos, en este punto ahora tenemos dos tablas: una con una lista de personas y otra con una lista de géneros:
Sin embargo, esto no nos ayuda, porque todavía no tenemos forma de saber de qué género son John y Mary. Entonces ahora necesitamos definir una relación entre las tablas. En este caso, una persona solo puede tener como máximo un género, pero puede haber muchas personas del mismo género. Esto significa que necesitamos una relación 1: m * o One to Many , que puede verse así:
* los símbolos donde las líneas se conectan a las tablas se conocen como notación “Pies de cuervo”. En este caso, estamos mostrando a la izquierda que una persona puede tener “1 o ningún género”, y a la derecha estamos mostrando que un género puede tener “1 o muchas personas”.
Una vez que establezcamos esta relación y agreguemos la columna genderId a la tabla de personas, todo lo que tenemos que hacer es guardar el genderId correcto y luego sabemos de qué género es cada persona:
Pero eso realmente no responde la pregunta sobre cómo establecemos amistades, ¿verdad? Bueno, entremos en eso.
Primero, sabemos que una persona puede tener muchos amigos, y que muchos de esos amigos pueden ser amigos entre sí. También podríamos querer saber cuándo se hicieron amigos, ¿verdad? Aunque inicialmente podría tener sentido tener una mesa donde almacenamos a todos los amigos de Mary, lo que realmente necesitamos es una forma de almacenar TODAS las amistades en una sola mesa. En este caso, una relación de Muchos a Muchos es lo que estamos buscando. Eso podría verse así:
Esto parece extraño, pero lo que hemos hecho es crear una tabla de “amistad” que almacena lo siguiente: una referencia a una persona, una referencia a otra persona y una fecha. Entonces, al completar una sola fila, podemos establecer una amistad entre John y Mary:
Llenemos algunas personas más en nuestra red social y establezcamos algunas amistades más:
Finalmente, tenemos una estructura que podemos usar si queremos determinar quién es amigo de quién.
Entonces, por ejemplo, si quisiera saber con quién es amigo John Smith, haría algo como esto:
¿Qué pasa si quiero la lista de amigos de Mary? Hago esto en su lugar:
¿Qué pasa si quiero saber qué amigos tienen John y Mary en común? Puedo hacer algo como esto:
* Nota: No he hecho ningún esfuerzo para optimizar estas consultas; lo más probable es que haya varias formas mejores de intentar hacer un MySQL INTERSECT.
¿Qué hay de John y Richard?
¿Qué hay de Mary y Richard?
¿Qué hay de John y Kari?
John y Kari no tienen amigos en común.
También puede recopilar o filtrar información adicional uniéndose a otras tablas … por ejemplo, agreguemos el género de todos los amigos que Mary y Richard tienen en común:
Como indiqué hace algunas capturas de pantalla, esto no está optimizado, pero espero que te dé una idea de cómo una sola tabla puede almacenar una relación entre dos personas e incluso almacenar metadatos al respecto (como cuándo se estableció y tal vez incluso el tipo de relación que es)