Модель данных для социальной сети? - PullRequest
8 голосов
/ 14 ноября 2010

Если бы я хотел создать сайт, который позволял бы пользователям иметь 0 или более «друзей», как бы я смоделировал такие отношения в базе данных?Будет ли что-то такое простое:тоже")?Или что-то вроде 6 градусов к Кевину-Бэкону?

РЕДАКТИРОВАТЬ 1:

Table Friends
- UserId (FK)
- FriendId (FK)
- Status ('Pending', 'Approved', 'Rejected', 'Blocked'?)

Ответы [ 3 ]

2 голосов
/ 14 ноября 2010

Это будет работать.Ниже следует отметить следующие моменты:

  • У вас есть что-то вроде подтверждения друга.Если да, вам придется подумать о том, как хранить «ожидающие»
  • Индексации как UserId, так и FriendId.Это значения, к которым вы будете присоединяться к таблицам.
  • Неупорядоченная пара (UserId, FriendId) является претендентом на первичный ключ.
  • Предположим, что Uid_1 и Fid_1 являются друзьями, где Uid_1! = Fid_1 затем хранит ваши таблицы друзей (Fid_1, Uid_1), а также (Uid_1, Fid_1).
  • Как далеко в степени отношенийвы собираетесь искать.

Каждый раз, когда вам нужно запросить DOR (степень взаимосвязи), вам придется инициализировать график и запускать алгоритм кратчайшего пути (это наименьшая оптимизация, о которой я могу подумать).Если ваш счет увеличится до нескольких килограммов, то как вы собираетесь с этим справиться?

1 голос
/ 14 ноября 2010

Вам нужно много-много отношений - у вас может быть 0 или более друзей, у каждого друга может быть 0 или более друзей.Наиболее распространенный подход - связать обоих пользователей в дополнительной таблице.Вам нужна просто дополнительная таблица БД: create table Relationships( user1 int not null references Users(id), user2 int not null references Users(id) ); Вы определенно хотите создать индексы для user1 и user2.

Я думаю, вам не нужен столбец ID.Еще одна вещь, которую вы должны знать о том, что если я твой друг, ты мой друг.Когда вы вставляете ([u1], [u2]) в таблицу отношений, сначала проверьте, есть ли связь ([u1], [u2]) или ([u1], [u2]).Если есть такое отношение, не вставляйте другое, это может нарушить вашу логику.

Если вам нужно какое-то подтверждение, как в большинстве популярных социальных сетей, вы должны создать другую таблицу PendingRelationsihps, которая будет иметь ту же схему БД, что и отношение.После подтверждения вы перенесете запись из отношений в ожидании отношений в отношения.

Надеюсь, это вам поможет.

0 голосов
/ 13 июня 2011

@ devfreak абсолютно прав, но я бы не стал делать «ожидающие» таблицы.Это просто избыточно.Таблица друзей может иметь поле статуса, и вы можете запрашивать его в зависимости от статуса.

...