Я строю социальный график для своего сайта.Пользователи будут создавать отношения (формы подписчик / подписчик), где каждая сторона может независимо следовать за другой.Моя таблица пользователей выглядит следующим образом:
Users table
- UserId (PK, Auto-incrementing integer)
Думая о том, как смоделировать это, я придумал несколько альтернатив, таких как:
(a) Таблица содержит каждую подписку'действие в виде отдельной строки.
Relationships table
- FollowerId (FK to Users.UserId)
- FollowedId (FK to Users.UserId)
Это имеет тот недостаток, что, учитывая множество пользователей, он создает огромное количество строк.
(b) Таблица содержит список пользователей.каждый пользователь следует в виде CSV или другой структуры:
Relationships table
- FollowerId (FK to Users.UserId)
- FollowingUsers (e.g. 2,488,28,40)
Недостатком является то, что запросы будут намного сложнее (и дороже?).Я также должен был бы поддерживать порядок строковых значений и т. Д. ...
(c) Отношение в строке, где пользователь может находиться на любой "стороне" отношения:
Relationships table
- Party1Id (FK to Users.UserId)
- FollowingParty2 (boolean)
- Party2Id (FK to Users.UserId)
- FollowingParty1 (boolean)
Это сохраняет строки над (a), но запросы являются более сложными, потому что пользователь может быть любой из сторон.
(d) Помещение обоих «следующих» и «сопровождаемых» как списков, подобных (b)
Relationships table
- UserId (FK to Users.UserId)
- FollowingUsers (e.g. 2,488,28,40)
- FollowedBy (e.g. 2,488,28,40)
Это кажется лучшим из всех миров, но теперь я должен использовать транзакции для обновления нескольких строк.
Предполагается, что я хочу масштабировать до большого размера, хотя знаю, что«Проблемы Facebook - это не мои проблемы» - какой вариант или какой другой вариант предпочтительнее?