2008-12-12 4 views
2

Я хочу создать многопоточный форум для электронного сайта (openource asp.net mvc of the course, хотя это не имеет значения для этого вопроса).Какая оптимальная структура БД для многопоточного форума?

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

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

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

Ниже приводится структура, что я имею в виду (бесстыдно забрал у) Stephen Walther Excellent blog post

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

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

Таблица: RelatedForum

· ForumId 
· RelatedForumId 

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

Заранее благодарен.

+0

Спасибо за все ответы. Я по-прежнему буду держать этот вопрос открытым, чтобы получить больше ресурсов, и, поскольку у меня все еще есть время, чтобы завершить общий дизайн. – 2008-12-12 15:28:46

ответ

1

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

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

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

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

Для более продвинутых способов хранения hierarcical данных в СУБД, вы можете посмотреть в ответы на этот вопрос (это не мои, «не рыболовный до-голоса» предназначены): "What is the most efficient/elegant way to parse a flat table into a tree?"

+0

Это действительно интересно. Я посмотрю на это. – 2008-12-12 08:53:48

0

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

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

Таблица: Thread

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

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

+1

Было бы намного полезнее, если бы вы объяснили, почему! – eliego 2008-12-12 09:35:07

0

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

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

+0

Да. Автор - это идентификатор из таблицы пользователя. Да, я согласен с именем ThreadId. – 2008-12-12 15:24:30

Смежные вопросы