|
|
|
| Добрый день, не могу придумать оптимальное решение для следящей задачи: на сайте 500 статей, в у каждой статьи есть поле keyword (varchar 250), в нем храниться ключевые слова статьи. На странице со статьями есть блок «похожие статьи» там выводиться 5 схожих статей, схожесть статей вычисляется методом шинглов (число от 0 до 1, можно до множить на 100, чтобы в поле заносить целое число), все это дело вычисляется на ходу, понятное дело процесс вычисления трудоемкий для сервера и страницы со статьями с каждой новой статьей будут грузиться дольше, решил создать новую таблицу где будет для каждого ID статьи хранится ТОП 5 статей, чтобы не вычислять каждый раз, а по быстрому извлекать из БД нужную инфу (при добавлении статьи все данные будут пересчитываться и заново заноситься в таблицу).
Как решить задачу более рационально?
Если делать БД где id1 (айди первой статьи), id2 (айди второй статьи), procent (процент схожести статей), то один к одному заносить статьи, т.е. место:
Id1 id2 procent
456 789 89
789 456 89
|
Сокращу до одной записи:
Id1 id2 procent
456 789 89
|
Как сделать такой запрос, чтобы извлекал, когда я не знаю где будет стоять айди в поле id1 или в id2? (все поняли о чем я?)
Извиняюсь за много букв. | |
|
|
|
|
|
|
|
для: ntro123
(10.06.2013 в 20:36)
| | Погодите, а почему ключевые слова прямо в таблице стетей? и почему это поле varchar? Может вынести не ТОП 5 статей, а сами ключевые слова? Причем слова в отдельную таблицу, а связи статей с ними в другую? Тогда у вас все операции будут сводиться к этой промежуточной таблице, где ничего кроме внешних ключей (целых чисел) нет. И все будет довольно шустро работать (особенно на таком небольшом объеме). | |
|
|
|
|
|
|
|
для: cheops
(10.06.2013 в 21:40)
| | Объем будет расти до несколько тысяч.
varchar потому что ключевые слова умещаются в 250 символов.
потому что при извлечении статей на страницу мета тег кейвордс заполняется этим полем.
"Может вынести не ТОП 5 статей, а сами ключевые слова?"
смысле? зачем? объем будет в разы больше.
Будет все тоже самое, но структура будет такой:
id статьи, кейвордс, процент схожести.
Все тоже самое, но место int поля будет varchar.
Может я не правильно как-то описал задачу?
Нужно провести сложную операцию (сложная т.к. в mysql такое не провернуть), вычислить схоесть между всеми статьями, и когда скажем извлекают статью номер 123 то из таблицы схожести дать все записи где встречается в поле id1 или id2, но проблема в том что, чтобы сэкономить место я не буду делать запросу 1 к 1, а то получится что при 500 статей таблица будет размером в 500*5=2500, а если сократить, то так чтобы запись была место:
id1 id2 procent
224 1 89
224 2 11
224 3 10
1 224 89
1 888 98
1 452 99
...
|
id1 id2 procent
224 1 89 // убираем это поле т.к. оно уже есть
224 2 11
224 3 10
1 224 89 // вот тут.
1 888 98
1 452 99
...
|
Но тогда сталкиваемся с проблемой извлечения схожих статей, т.к. айди текушей статьи может находиться как в поле id1 или id2. | |
|
|
|
|
|
|
|
для: ntro123
(10.06.2013 в 22:10)
| | Принципе решение простое:
<?php
...
$article_id=123;
mysql_query("SELECT id1,id2 FROM table WHERE id1=".$article_id." OR id2=".$article_id." ORDER BY procent");
?>
И дальше сранивать не равнел ли $article_id id1 или id2 ... в целом пойдем, но мб есть вообще кардинально другое решение? | |
|
|
|
|
|
|
|
для: ntro123
(10.06.2013 в 22:19)
| | А просто кешировать блок «похожие статьи» для каждой статьи не судьба? Обновления раз в день или как часто добавляются новые статьи вполне достаточно. | |
|
|
|
|
|
|
|
для: ntro123
(10.06.2013 в 22:19)
| |
SELECT id
FROM( SELECT id2 as id, procent FROM tbl WHERE id1=224
UNION
SELECT id1, procent FROM tbl WHERE id2=224
)t
ORDER BY procent DESC
LIMIT 5
| не проверял, но должно работать. | |
|
|
|