структура базы данных для требования типа стены в фейсбуке - PullRequest
2 голосов
/ 04 января 2012

Я работаю над сайтом социальной сети, и у него есть стена, такая как Facebook, где пользователь может публиковать статус, картинки и прочее.Строить стену только для пользователя - не сложная вещь.У меня есть такая структура.

Wall
  {
     Id,
     ToUserId (BigInt) (Owner of wall)
     ByUserId (The person who is posting)
     Content  (message, pic or something else)
     more fields....
  }

Эта стена только для пользователя, я не могу использовать ее повторно. Например, я думаю, что на сайте будут другие объекты, такие как Страницы, Группы и т. Д., Поэтому все объектыбудет иметь стены для них.Я не хочу создавать отдельную таблицу для каждой стены.

Тогда я подумал, что вместо ToUserId у меня может быть ObjectId, и моя структура будет такой:

  Wall
  {
     Id,
     ObjectId (BigInt)(PageId/UserId/GroupId (one of them))
     ByUserId (The person who is posting)
     Content  (message, pic or something else)
     more fields....
  }

Поскольку я использую поле Increment в своих таблицах, страница может иметь такой же Idкоторый есть у пользователя.так что это опять проблема.

Далее, я подумал, мой объект должен иметь строковый тип

Wall
  {
     Id,
     ObjectId (string(10))(PageId/UserId/GroupId (one of them))
     ByUserId (The person who is posting)
     Content  (message, pic or something else)
     more fields....
  }

Теперь для пользователя я добавлю «U» к числу, чтобы идентификатор объекта был «1U», «2U ", а для страниц они будут" 1P "," 2P ", а для группы" 1G "," 2G ".

Но я все еще не уверен, хотел бы услышать совет специалиста по этому вопросу.

Обновление

Спасибо, ребята, у меня проблема в том, как сохранить один стол для всех типов стен.

A wall for a User
A Wall for a Page
A Wall for a Group

Если вы посмотрите на facebookЭто одна стена или, по крайней мере, я хочу построить ее, поэтому она должна быть прикреплена к любому объекту (пользователю, странице, группе или чему-либо).

Надеюсь, это имеет больше смыслаТеперь.

Ответы [ 2 ]

0 голосов
/ 04 января 2012

Я не понимаю, почему вы пытаетесь создать какую-то "строковую" ссылочную структуру. Это не кажется "реляционным".

Как насчет этого?

A Пользователь имеет много Сообщений .

A Пользователь имеет один Стена .

A Пост имеет один Стена .

A Сообщение имеет один Пользователь .

A Стена имеет много сообщений .

A Стена имеет один Пользователь .

POCO (потому что я не могу быть обеспокоен написанием SQL)

public class User
{
   public int UserId { get; set; }
   public ICollection<Post> Posts { get; set; } // the Posts this user has written. Could be against different Wall's
   public Wall Wall { get; set; } // the User's wall.
}

public class Post
{
   public int PostId { get; set; }
   public User User { get; set; } // the User who wrote the post. 
   public Wall Wall { get; set; } // the Wall this Post belongs to. 
}

public class Wall
{
   public int WallId { get; set; }
   public ICollection<Post> Posts { get; set; } // all the posts on this Wall.
}

Допущения:

  • A Пост можно сделать только против одной Стены .
0 голосов
/ 04 января 2012

Я бы выбрал отдельные пустые поля для каждой возможной ссылки. Это также позволит вам использовать внешние ключи, и если вы захотите, вы даже можете сделать контрольное ограничение, чтобы во всех строках была определена только одна ссылка. Я бы определенно НЕ рекомендовал использовать эту идею с идентификатором строки - было бы неэффективно объединяться с этим.

create table [Posts]
(
    [ID] int not null identity(1, 1),
    [ID_FromUser] int not null,
    [ID_ToUser] int null,
    [ID_ToPage] int null,
    [ID_ToGroup] int null,
    [Content] nvarchar(max) not null,
    -- more stuff

    constraint [FK_Posts_FromUser] foreign key ([ID_FromUser]) references [Users]([ID]),
    constraint [FK_Posts_ToUser] foreign key ([ID_ToUser]) references [Users]([ID]),
    constraint [FK_Posts_ToPage] foreign key ([ID_ToPage]) references [Pages]([ID]),
    constraint [FK_Posts_ToGroup] foreign key ([ID_ToGroup]) references [Groups]([ID]),
    constraint [PK_Posts] primary key ([ID])
)
...