Какова оптимальная структура БД для многопоточного форума? - PullRequest
2 голосов
/ 12 декабря 2008

Я хочу построить многопоточный форум для электронного сайта (opensource asp.net mvc ofcourse, хотя для этого вопроса это не имеет значения).

Какой должна быть структура БД, которая поможет получать сообщения форума с оптимальной производительностью? Я не ставлю нет. к нему, поскольку он может варьироваться в зависимости от количества извлекаемых строк.

Кроме того, я должен иметь возможность связать определенную тему с другими темами. Например, показать "Ссылки по теме на форуме".

Я использую SQL Server 2005.

Ниже приведена структура, которую я имею в виду (беззастенчиво взяла ее) Стивен Вальтер Отличный пост в блоге

Таблица: Форум

· Id
· ParentId  (null if this is the first message)
· ParentThreadId  (Identify message in the same thread)
· Author
· Subject
· Body
· PostedDate

Таблица: связанный форум

· ForumId
· RelatedForumId

Идеи / предложения приветствуются.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 12 декабря 2008

Если у вас есть нерекурсивный нисходящий (Forum -> Thread -> Postings) поиск ваших данных для наиболее распространенного варианта использования, тогда эта структура таблицы будет хорошим началом, потому что это приведет в основном к WHERE ParentId = @SomeId запросов.

Если вы захотите вычислить такие вещи, как «Сколько сообщений существует в этом форуме / теме?», Вы легко попадете в ситуацию, когда вы не сможете определить, какие идентификаторы вложены в какие другие идентификаторы (т.е. детские отношения отсутствуют).

Вы могли бы объяснить это путем избыточного сохранения ThreadId и ForumId в каждой публикации. Тогда вы сможете спросить SELECT COUNT(*) FROM Postings WHERE ThreadId = @SomeId.

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

Чтобы получить более продвинутые способы хранения иерархических данных в СУБД, вы можете посмотреть ответы на этот вопрос (это мой собственный вариант, не предусматривающий фишинга): «Что является наиболее эффективным / элегантным?» способ разбить плоский стол на дерево? "

0 голосов
/ 12 декабря 2008

выглядит хорошо. Я бы назвал ParentThreadID просто ThreadID. Добавление ForumID не повредит, особенно для подсчета.

Вы должны добавить AuthorName. Предположительно Author - это идентификатор вашей пользовательской таблицы. Вытащите это имя пользователя и прикрепите его сейчас. Это избавляет вас от необходимости поиска 50 имен из пользовательской таблицы при отображении списка тем или ответов. Точно так же, если пользователь удаляется из системы, вы больше не можете искать имя. И, конечно, не хочу удалять эти узлы из дерева.

0 голосов
/ 12 декабря 2008

Таблица: сообщение

· ThreadId
· UUID
· Author
· Subject
· Body
· PostedDate  

Таблица: Тема

·ThreadID
·Forum
·UUID
·Author
·Subject
·Body
·PostedDate

Только на сервере MySQL с кэшированием и индексированием. В остальном эта структура не самая лучшая, но с указанным сервером это облегчает подсчет и полнотекстовый поиск

...