Как я реализую поточные комментарии?

Для меня работало изменение семейства шрифтов на Calibri (или любой другой общепринятый шрифт).

Пример:

<span style="font-family:Calibri">&#35; My_Text</span>
26
задан Niyaz 28 February 2009 в 21:22
поделиться

4 ответа

Хранение деревьев в базе данных является предметом, который имеет много различных решений. Это зависит от того, если Вы хотите получить субиерархию также (так все дети объекта X) или если Вы просто хотите захватить весь набор иерархий и создать дерево в O (n) путь в памяти с помощью словаря.

Ваша таблица имеет преимущество, что можно выбрать все комментарии к сообщению в 1, идут, путем фильтрации на parentpost. Поскольку Вы определили родителя комментария в учебнике путь / наивный путь, необходимо создать дерево в памяти (см. ниже). Если Вы хотите получить дерево из DB, Вам нужен другой способ сохранить дерево: См. мое описание pre-calc базирующийся подход здесь: http://www.llblgen.com/tinyforum/GotoMessage.aspx?MessageID=17746&ThreadID=3208 или сбалансированные деревья использования, описанные CELKO здесь :

или еще один подход: http://www.sqlteam.com/article/more-trees-hierarchies-in-sql

, Если Вы выбираете все в иерархии в памяти и создаете дерево там, это может быть более эффективно вследствие того, что запрос довольно прост: выбрать.. из Комментария, где ParentPost = @id ORDER BY ParentComment ASC

После того запроса, Вы создаете дерево в памяти со всего 1 словарем, который отслеживает кортеж CommentID - Комментарий. Вы теперь идете через набор результатов и создаете дерево на лету: каждый комментарий, с которым Вы сталкиваетесь, Вы можете поиск его parentcomment в словаре и затем хранить комментарий, в настоящее время обрабатываемый также в том словаре.

14
ответ дан Frans Bouma 19 July 2019 в 15:16
поделиться

Ваш текущий дизайн в основном хорошо для маленьких иерархий (меньше чем тысяча объектов)

, Если Вы хотите выбрать на certian уровне или глубине, добавьте объект 'уровня' к своей структуре и вычислите ее как часть сохранения

, Если производительность является использованием проблемы достойный кэш

3
ответ дан TFD 19 July 2019 в 15:16
поделиться

Я добавил бы следующие новые поля к вышеупомянутой таблице:

  • thread_id: идентификатор для всех комментариев, присоединенных к конкретному объекту

  • дата: дата комментария (позволяет выбирать комментарии в порядке)

  • разряд: разряд комментария (позволяет выбирать порядок комментария путем рейтинга)

Используя эти поля Вы будете в состоянии:

  1. выборка все комментарии в потоке в единственном op
  2. заказывают комментарии в потоке или по дате или разряд

, К сожалению, если Вы хотите сохранить свой DB запросов близко к стандарту SQL, необходимо будет воссоздать дерево в памяти. Некоторый DBS предлагает специальные запросы для иерархических данных (f.e. Oracle)

./alex

3
ответ дан alexpopescu 19 July 2019 в 15:16
поделиться

Вещи пары также рассмотреть...

1) При высказывании "вида как reddit" на основе разряда или даты Вы имеете в виду верхний уровень или все это?

2) Когда Вы удаляете узел, что происходит с ответвлениями? Вы повторно порождаете их? В моей реализации я думаю, что редакторы решат - или скрыть узел и отобразить его как "комментарий, скрытый" наряду с видимыми детьми, скрыть комментарий, и это - дети, или уничтожьте целое дерево. Перепорождение должно быть легким (просто устанавливает родителя chidren на родителя deleted), но это что-либо включающее целое дерево, кажется, хитро для реализации в базе данных.

Я смотрел на ltree модуль для PostgreSQL. Это должно сделать операции базы данных, включающие части дерева немного быстрее. Это в основном позволяет Вам создать поле в таблице, которая похожа:

ltreetest=# select path from test where path <@ 'Top.Science';
                path                
------------------------------------
 Top.Science
 Top.Science.Astronomy
 Top.Science.Astronomy.Astrophysics
 Top.Science.Astronomy.Cosmology

Однако это не гарантирует вида ссылочной целостности самостоятельно. Другими словами, у Вас могут быть записи для "Вершины. Наука. Астрономия", не имея записи для "Вершины. Наука" или "Вершина". Но чему это действительно позволяет, Вы сделать наполнить как:

-- hide the children of Top.Science
UPDATE test SET hide_me=true WHERE path @> 'Top.Science';

или

-- nuke the cosmology branch
DELETE FROM test WHERE path @> 'Top.Science.Cosmology';

Если объединено с традиционным "comment_id" / "parent_id" подход с помощью хранимых процедур, я думаю, что можно получить лучший из обоих миров. Можно быстро пересечь дерево комментария в базе данных с помощью "пути" и все еще гарантировать ссылочную целостность через "comment_id" / "parent_id". Я предполагаю что-то как:

CREATE TABLE comments (
comment_id SERIAL PRIMARY KEY,
parent_comment_id int REFERENCES comments(comment_id) ON UPDATE CASCADE ON DELETE CASCADE,
thread_id int NOT NULL  REFERENCES threads(thread_id) ON UPDATE CASCADE ON DELETE CASCADE,
path ltree NOT NULL,
comment_body text NOT NULL,
hide boolean not null default false
);

Строка пути для комментария похожа быть

<thread_id>.<parent_id_#1>.<parent_id_#2>.<parent_id_#3>.<my_comment_id>

Таким образом корневой комментарий потока "102" с comment_id "1" имел бы путь:

102.1

И ребенок, comment_id которого равняется "3", был бы:

102.1.3

Некоторые дети "3" идентификатор наличия "31" и "54" были бы:

102.1.3.31
102.1.3.54

Для сокрытия узла "3" и его дети Вы выпустили бы это:

UPDATE comments SET hide=true WHERE path @> '102.1.3';

Я не знаю, хотя - это могло бы добавить бесполезные издержки. Плюс я не знаю, как хорошо сохраняемый ltree.

5
ответ дан Cory R. King 28 November 2019 в 17:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: