powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать бд для вот такой задачи?
25 сообщений из 109, страница 2 из 5
Как организовать бд для вот такой задачи?
    #38696819
Триггерман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly B,
Всё, что вы сможете сделать - это разработать грамотную структуру БД. Всё остальное - будут делать СУБД и железо, на котором она работает.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38696821
Anatoly B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrejkЯ пока пытаюсь в общем сложить конструктор в голове и попробовать простую реализацию, используя базовые знания.
andrejkДа, кстати — как оптимизировать хранение и поиск в большом объеме данных?
Раздели эти две задачи. Реши первую, проверь макс. задержки, найди что не нравится.....
По оптимизации погугли общие рекомендации, поищи книжечки, статейки. Ну а в целом каждая задача имеет свои особенности.
Если строк в таблице ... ну очень много, для этого есть свои СУБД, для примера Elasticsearch. Но это уже 2 задача ;-)
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38696905
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly BКак СУБД будет решать проблему оптимизации когда данные перестанут влезать в кэш?
Будет держать в кэше только активную часть данных.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697136
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятное дело, что теоретически бд может расти бесконечно, тут ничего не поделаешь. Проблема, которую я хочу решить, это избавиться от роста в геометрической прогрессии, т. к. трёхтабличная архитектура бд (как предлагалось выше и как я пробую сделать) вынуждает поле связей расти сразу на несколько десятков строк при добавлениии в бд всего одного файла с ключевыми словами.

Чтобы было понятно, попробу изложить задачу и текущий алгоритм решения.

Задача:

— вносить в бд с одной стороны ключевые слова, а с другой информацию о файле (его имя и путь к нему);
— закреплять за этим файлом (привязывать к нему) некоторые ключевые слова;
— по заданному ключевому слову искать в бд все другие ключевые слова, привязанные к файлам, к которым привязано и заданное ключевое слово;
— выводить найденные ключевые слова списком с сортировкой по частоте встречания в пределах условия поиска.

А вот как я решил запрос к бд (спасибо Anatoly B за скелет запроса):

<?php

if ($_POST["podobrat"] & $_POST["kluch_slovo"])
{
$podkluchenie = mysql_connect("***","***","***") or die("MySQL сервер недоступен!".mysql_error());
mysql_query("
SET character_set_database=utf8
");
mysql_query("
SET NAMES utf8
");

mysql_select_db(
"webart_servis_kluchevyx_slov", $podkluchenie) or die("MySQL сервер недоступен!".mysql_error());

$kluch_slovo = $_POST["kluch_slovo"];

$rezultat_podbora = mysql_query("
SELECT `slova` FROM `tablitzca_slov` WHERE `id` in
(SELECT `id_slova` FROM `tablizca_svyazej` WHERE `id_izobrazheniya` in
(SELECT `id_izobrazheniya` FROM `tablizca_svyazej` WHERE `id_slova` in
(SELECT `id` FROM `tablitzca_slov` WHERE `slova` = '".$kluch_slovo."')))
");

while ($data = mysql_fetch_array($rezultat_podbora))
{
echo "<input type=\"checkbox\" name=\"checkbox\" checked=\"checked\"> " . $data['slova'] . "<br>";
}

mysql_close($podkluchenie);
}

?>

Бедная получается таблица связей, расти будет как на дрожжах — это для каждого файла нужно будет прописать в ней сразу несколько строк под каждое привязанное слово.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697137
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Блин, как код оформить?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697376
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkБлин, как код оформить?тег [ src ]
andrejkэто избавиться от роста в геометрической прогрессии , т. к. трёхтабличная архитектура бд (как предлагалось выше и как я пробую сделать) вынуждает поле связей расти сразу на несколько десятков строк при добавлениии в бд всего одного файла с ключевыми словами.Это не геометрическая прогрессия. Геометрическая - это если бы для каждого нового файла приходилось бы добавлять в N раз больше записей, чем для предыдущего. И даже не арифметическая :)
Ну а как вы хотели? Или так, или пихать все слова в одну строку. Недостатков у такого решения имхо больше:
1)не факт, что это будет занимать меньше места; если слова часто повторяются, то скорее будет даже больше
2)поиск по обычным индексам в таком варианте пролетает
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697383
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirЭто не геометрическая прогрессия. … И даже не арифметическая

Это я так страху нагоняю)) А вы бы как решили такую задачу?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697392
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk, либо этот вариант, либо все ключевые слова в одно поле рядом с файлом, и полнотекст на это поле. В рамках мускля других вариантов пожалуй что и нет.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697418
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думал ещё такой вариант — всё в одну таблицу:

| имя файла | слово1 | … | словоN | //строка полей
=============================
| имя1 | false | … | true |
-------------------------------------
| имя2 | false | … | false |
-------------------------------------
| имя3 | true | … | true |


Поиск связей между файлами и словами делается по логическим значениям true и false.

Но тогда вопрос, есть ли ограничения на максимальное количество полей в таблице, слов-то может насобираться с пару-тройку тысяч, а файлов на порядок больше, это точно?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697419
Триггерман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkДумал ещё такой вариант — всё в одну таблицу:

| имя файла | слово1 | … | словоN | //строка полей
=============================
| имя1 | false | … | true |
-------------------------------------
| имя2 | false | … | false |
-------------------------------------
| имя3 | true | … | true |


Поиск связей между файлами и словами делается по логическим значениям true и false.

Но тогда вопрос, есть ли ограничения на максимальное количество полей в таблице, слов-то может насобираться с пару-тройку тысяч, а файлов на порядок больше, это точно?Гениально!
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697429
Anatoly B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТриггерманAnatoly B,
Всё, что вы сможете сделать - это разработать грамотную структуру БД. Всё остальное - будут делать СУБД и железо, на котором она работает.
Dimitry SibiryakovAnatoly BКак СУБД будет решать проблему оптимизации когда данные перестанут влезать в кэш?
Будет держать в кэше только активную часть данных.

Это понятно, что "впихнуть невпихуемое"(с) нельзя.
Вот и вопрос как СУБД будет решать проблему оптимизации запроса, который приводит к постоянному чтению диска и лопатит тонны информации. Мой ответ - никак. Только изменяя сам запрос, наложение ограничений на рез-т и поисковые критерии ... можно (попробовать) упростить/ускорить запрос, в конце концов поделить его на более мелкие.... И это не всегда очевидно на этапе разработки структуры.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697434
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrejkДумал ещё такой вариант — всё в одну таблицу:

| имя файла | слово1 | … | словоN | //строка полей
=============================
| имя1 | false | … | true |
-------------------------------------
| имя2 | false | … | false |
-------------------------------------
| имя3 | true | … | true |


Поиск связей между файлами и словами делается по логическим значениям true и false.

Но тогда вопрос, есть ли ограничения на максимальное количество полей в таблице, слов-то может насобираться с пару-тройку тысяч, а файлов на порядок больше, это точно?

Ну всё же, конкретно по такому подходу, люди добрые, что можете сказать?

Anatoly B , что вы про это думаете, если сравнить с трёхтабличной архитектурой, которую вы предлагали?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697437
Триггерман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkчто вы про это думаете, если сравнить с трёхтабличной архитектурой, которую вы предлагали?
Ваша архитектура - бесподобна !
Вы - творчески одаренный талантливый программист-разработчик БД. Вам бы в Microsoft работать - им такие спецы ох как нужны.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697440
Anatoly B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ничего я по этому не думаю, т.к. это не вариант.
Добавления нового слова - это DDL операция, т.е. требуем блокировки таблицы + долго.
Битовые индексы по всем полям делать - жуть. Занимаемый дисковый размер - будет больше на больших данных...
Да и работать неудобно. Какое поле (словоN или словоМ) использовать чтобы найти искомое слово , скажем, "вариант". Делать массив соответствия "имя поля - слово "? Ну и далее в таком духе ...
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697450
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно, остановлюсь на таблице связей. Пока она будет расти, надеюсь, успею изучить партицирование т. д.)))
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697588
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
$rezultat_podbora = mysql_query("
	SELECT `slova` FROM `tablitzca_slov` WHERE `id` in
    (SELECT `id_slova` FROM `tablizca_svyazej` WHERE `id_izobrazheniya` in 
	(SELECT `id_izobrazheniya` FROM `tablizca_svyazej` WHERE `id_slova` in 
	(SELECT `id` FROM `tablitzca_slov` WHERE `slova` = '".$kluch_slovo."')))
	");



Ребята, наткнулся ещё на одну головоломку. Вот этот запрос выдаёт все слова, которые привязаны к изображениям с исходным словом. Хочу сделать возможным поиск не по одному ключевому слову, привязанному к файлу, а сразу по нескольким (от одного до бесконечности). Т. е. результирующий список ключевых слов будет извлекаться только из тех файлов, в которых есть сразу все заданные изначально слова.

Проблема вот в чём: не могу сообразить, как цикл совместить с запросом. Или, может, в языке SQL есть уже подобная функция?

Если понятно изложил, подскажите, пожалуйста синтаксис запроса или хотябы логику.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697600
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkЕсли понятно изложилНе совсем. Нужно найти файлы, привязанные к такому же (или более обширному) пулу тегов, что и заданный файл?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697615
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Попробую на примере.

Мы задаём, например, три ключевых слова для поиска.
Бд ищет все файлы, к которым привязаны сразу все три наши заданные слова.
Бд проверяет у всех найденных файлов связи с другими словами и выдаёт все связанные слова.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697631
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ясно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select distinct w.нужные_поля
from words w
join files2words f2w on f2w.idfile=f.id
join (select f2w_2.idfile
 from files2words f2w_2
 join words w1 on f on f2w_2.idword=w1.id
 where w1.name in (список_слов)
 group by 1
 having count(distinct f2w_2.idword) >= количество_слов_в_списке
) t0 on f2w.idfile=t0.idfile
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697770
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А сам запрос

Код: plsql
1.
2.
3.
4.
5.
6.
$rezultat_podbora = mysql_query("
	SELECT `slova` FROM `tablitzca_slov` WHERE `id` in
    (SELECT `id_slova` FROM `tablizca_svyazej` WHERE `id_izobrazheniya` in 
	(SELECT `id_izobrazheniya` FROM `tablizca_svyazej` WHERE `id_slova` in 
	(SELECT `id` FROM `tablitzca_slov` WHERE `slova` = '".$kluch_slovo."')))
	");



изменить нельзя, только другой писать?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697794
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejk, у вас тут куча IN-подзапросов. Ещё и вложенных. Если версия мускл 5.5 и ниже, то на объёме данных, отличном от смехотворного, запрос начнёт сурово тормозить.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697803
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может тогда можно их разбить на простые?
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697807
Serzh007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tanglirясно

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select distinct w.нужные_поля
from words w
join files2words f2w on f2w.idfile=f.id
join (select f2w_2.idfile
 from files2words f2w_2
 join words w1 on f on f2w_2.idword=w1.id
 where w1.name in (список_слов)
 group by 1
 having count(distinct f2w_2.idword) >= количество_слов_в_списке
) t0 on f2w.idfile=t0.idfile



Можете дать комментарии к синтаксису, а о в вашем примере много мне незнакомого) Не совсем понятны ваши условные обозначения.
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38697814
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrejkНе совсем понятны ваши условные обозначенияа какие там вообще "обозначения"? ну разве имена таблиц, так вроде бы русскиманглийским языком написано: files - файлы, words - слова, files2words - связи (идфайла, идслова)
...
Рейтинг: 0 / 0
Как организовать бд для вот такой задачи?
    #38698109
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
25 сообщений из 109, страница 2 из 5
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Как организовать бд для вот такой задачи?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]