Поиск отношений данных или графиков во многих таблицах SQL

В моей работе есть несколько типов таблиц многих-многих-многих. У меня есть приложения, которые связывают слова с другими словами (ngrams) и базами данных, которые могут связывать пользователей с другими пользователями (друзьями/последователями).

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

Возьмем следующую упрощенную таблицу базы данных с внешним ключом, связывающим node с другим node.

id | node1 | node2 
--------------------
1 | 1 | 2
2 | 1 | 3
3 | 1 | 4
4 | 2 | 1
5 | 2 | 3
6 | 2 | 5
7 | 3 | 1

Например, в приведенной выше таблице может быть очевидно, что "1" является самым популярным, поскольку он связан с большинством (на 2 и 3). Также может показаться, что возможно "2" следует связать с "4", поскольку "2" разделяет так много отношений с "1" (и "1" связано с "4" ).

Итак, например, я мог найти:

  • которые соединяют узлы с другими узлами.
  • полезные соединения на основе сходства (рекомендации)
  • группы узлов, которые совместно используют связанные соединения

Другими распространенными формами отношений являются такие вещи, как user <=> friends или blog_post <=> tags.

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

4 ответа

Как указывает друг, ваша структура данных хороша для того, что вы пытаетесь сделать. Это вопрос о том, как вы собираетесь представлять информацию?

Что-то для изучения - это некоторые методы перемещения w630 для определения количества переходов между узлами (relavancy), количество узлов соединяется с одним node (широтой), сколько хмелей может иметь значимый путь (глубина). Единственное, что я хотел бы рассмотреть, это использование, чтобы помочь определить relavancy. Это более или менее показало бы счетчик, сколько раз путь node был пройден во время использования. Здесь вы можете начать назначать вес для определенного пути. Например, если путь от 1 до 5 (1 → 2 → 5) перемещается в качестве первого обхода, он может выглядеть примерно так:

id | node1 | node2 | count
------------------------------
1 | 1 | 2 | 1
2 | 1 | 3 | 0
3 | 1 | 4 | 0
4 | 2 | 1 | 0
5 | 2 | 3 | 0
6 | 2 | 5 | 1
7 | 3 | 1 | 0

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

Имейте в виду, что с такой структурой данных вам понадобится метод для перехода в каждом направлении (1 → 5 и 5 → 1)


Из того, что я помню о графах, вам могут пригодиться алгоритмы Дейкстра-Принна и Крускаля. Они оба ищут алгоритмы (я не помню, являются ли они BFS или DFS... это было время: p), которые помогут вам взять весь граф и найти оптимальные пути прохождения.

Они не получат вам SQL-запрос, но они предоставят математическую "плату для дайвинга", которая поможет вам получить логику для ваших SQL-запросов.

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

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

Желаем удачи.


Возможно, поиск NOSQL-db будет лучшим способом решения проблемы. Чтобы быть более конкретным, используйте некоторый график db, такой как neo4j, чтобы сначала представлять ваши данные sql, а не просто пересекать график, чтобы найти отношения и группы, которые вы хотите.

в вашем случае использования всегда лучше использовать график db, так как производительность в несколько раз выше, чем при использовании sql с несколькими объединениями в таблицах.


Powergagets может создавать графики и диаграммы с использованием данных SQL.

licensed under cc by-sa 3.0 with attribution.