Всем здравствуйте, необходимо реализовать систему комментирования, по типу комментарий-ответ, к примеру как на тостере и многих других приложениях. Если есть, ссылку на источник,чтобы почитать, что для этого нужно или простейшие объяснения на пальцах.
Слишком общий вопрос. С чем именно возникают проблемы? Или вообще нулевые значения по всем фронтам? :-)
В базе данных создается таблица, например, comments:
id_comments int primary key identity not null,
-- родительский комментарий: ноль - верхний уровень, больше нуля - идентификатор комментария
-- можно без привязки друг к другу, будет проще
parent_id int not null,
-- ссылка на комментируемый объект
id_комментируемые_объект int not null,
-- ссылка на автора
id_users int not null,
-- текст комментария
comment_text nvarchar(max) not null,
-- дата добавления
date_add datetime not null
-- еще что-нибудь, что потребуется. Например:
-- * ip пользователя;
-- * статус проверки модератором;
-- * рейтинг;
-- * счетчик жалоб пользователей;
-- * счетчик просмотров;
-- * и т.п., на сколько хватит фантазии
Если пользователей нет и комментарии смогут добавлять все, кому не лень, без регистрации, то в базу следует добавить дополнительные поля для указания имени автора и ссылки (email и/или url, или еще что-нибудь).
На стороне клиента, необходимо добавить форму: textarea, кнопка отправки. Еще можно капчу засунуть (но лучше без неё), форму регистрации/входа/восстановления пароля.
В серверном коде написать код добавления данных в базу :-)
Здесь сложно что-то конкретное сказать, все зависит от методов, которые используются.
В MVC лучше сделать класс, который будет представлять комментарий. Ну и коллекция таких классов будет полезна, при выводе комментариев.
С выводом аналогично. При работе с базой лучше использовать T-SQL. Хотя, если проект небольшой и комментариев будет мало, то можно и LINQ задействовать с автоговнокодом, но аккуратно, чтобы Земля не остановилось, а то люди начнут падать на ровном месте, а на кривом вообще улетят в космос. Но если комментариев много и вывод нужен сложный, особенно деревья, то лучше силами ручного T-SQL это сделать, чтобы найти лучшее решение и было пространство для оптимизации.
На Тостер все просто. Я бы обошелся одной хранимой процедурой, которая вернула бы всё, что нужно.
Вопросы и ответы имеет смысл хранить в одной таблице. Комментарии, в принципе тоже можно, но здесь они являются скорее бесполезным мусором, типа этого, так что можно их в отдельной таблице (или даже базе) держать. В итоге хранимая процедура вернула бы две-три таблицы:
1. Вопрос и ответы к нему:
SELECT * FROM entries WHERE id_entries = @id_entries OR parent_id = @id_entries
2. Комментарии:
SELECT * FROM comments WHERE id_entries IN
(SELECT id_entries FROM entries WHERE id_entries = @id_entries OR parent_id = @id_entries)
Хотя я бы скорее всего использовал одну временную таблицу (или переменную) для нужных идентификаторов во всех этих запросах.
3. Список участников:
-- плохое решение, нужно лучше чесать репу. Но вечер, лень :-)
-- и в этом запросе я не уверен и не проверял его работу
-- просто для общей идеи
SELECT * FROM users WHERE id_users IN
(
SELECT DISTINCT(id_users) FROM entries WHERE id_entries = @id_entries OR parent_id = @id_entries
UNION
SELECT DISTINCT(id_users) FROM comments WHERE id_entries IN
(SELECT id_entries FROM entries WHERE id_entries = @id_entries OR parent_id = @id_entries)
)
Это все можно и без хранимой процедуры сделать, просто собрать в один запрос. Но хранимую процедуру будет проще поддерживать.
На сайте, если лень, проект игрушечный или нету ничего под рукой, можно прямо из DataSet собрать и вывести данные (типа: DataSet.Table["комментарии"].Select("id_записи = " + idВыводимойЗаписи)). Для удобства работы, можно повозиться с классами.
Алексей Немиро: я понимаю, вы сама скромность, но всё же. Это и поднимет рейтинг тэгу, и люди, пользующиеся поиском, быстрее найдут ответ на свой вопрос.