Какой дб мне подходит? - PullRequest
0 голосов
/ 21 мая 2010

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

Давайте предположим, что я создаю агрегатор новостей (который собирает новости с нескольких веб-сайтов). Затем я запускаю алгоритмы, чтобы определить, действительно ли две новости с разных сайтов относятся к одной и той же теме. Я запускаю этот алгоритм для кластеризации новостей вместе. Отношения изображены ниже:

cluster
\--news1
   \--word1
   \--word2
\--news2
   \--word3
\--news3
   \--word1
   \--word3

А потом я применю магию и определю важность каждого слова. Суммирование всей важности каждого слова дает мне важность статьи новостей. Суммирование важности каждой новостной статьи дает мне важность кластера.

Обратите внимание, что над кластером также есть подгруппы (например, разделенные по регионам и т. Д.) И категории (например, виды спорта и т. Д.), Которые я должен определить важность этого в конкретный день как таковой.

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

Также изменится показатель важности. Становится все труднее изменять таблицы, обновлять данные (которые я использую TRUNCATE TABLE), а затем вставлять их с нуля.

В настоящее время я смотрю на что-то без схемы, как Mongodb. Мне не нужна распределенность. Я бы очень хотел что-то достаточно быстрое (которое можно проиндексировать) и что-то более гибкое, чем традиционная RDMBS.

NEW

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

TABLE word ( word_id, news_id, word )
TABLE news ( news_id, date, site .. )
TABLE clusters ( cluster_id, cluster_leader, cluster_name, ... )
TABLE mapping_clusters_news( cluster_id, news_id)
TABLE word_importance (word_id, score)
TABLE news_importance (news_id, score)
TABLE cluster_importance( cluster_id, score)
TABLE group_importance( cluster_id, score)

Вы можете заметить, что в TABLE_word есть дополнительный столбец news_id. Это должно соответствовать столбцу TABLE_word_importance, потому что одно и то же слово может иметь разное значение в разных статьях (если вы знакомы с tfidf, это в основном что-то вроде этого).

Вся таблица «важности» теперь вычисляет важность каждого объекта путем усреднения важности всех дочерних объектов под ним. Это означает, что важность каждого кластера определяется всеми новостями внутри него, важность каждой новости определяется всеми словами внутри него и т. Д.

TYPICAL USAGE:
1) SELECT clusters FROM db THAT HAS word1, word2, word3, .. ORDER BY cluster_importance_score
2) SELECT words FROM db BELONGING TO THE CLUSTER cluster_id=5 ODER BY word_importance score.
3) SELECT groups ordered by importance score.

Как вы можете видеть, я получаю много оценок от каждого слоя, и кто-то говорит мне использовать материализованное представление для этой цели (которое поддерживает postgresql). Однако, как вы можете видеть, эта простая схема уже состоит из 8 таблиц (моя фактическая база данных состоит из 26 подобных таблиц, что добавляет столько дополнительных уровней сложности для сопровождения).

ПРИМЕЧАНИЕ ЭТОТ НЕ О ПОЛНОТЕКСТОВОМ ПОИСКЕ.

Ответы [ 5 ]

1 голос
/ 24 мая 2010

Когда схема усложняется, хорошей альтернативой может быть графовая база данных . Как я понимаю ваш домен, у вас много сущностей, связанных с другими сущностями по-разному. Имеет ли для вас смысл моделировать это как граф / сеть сущностей? В качестве пищи для размышлений я привел пример, используя Neo4j :

пример анализа новостей http://github.com/neo4j-examples/domain-models/raw/master/news-analysis.png

В graphdb вы можете установить свойства как для узлов, так и для отношений, что может быть полезно в вашем случае (например, количество раз, когда слово используется в записи новостей, может быть добавлено к отношению к этому слову). Кстати, я добавил дополнительные is_related отношения между двумя новостями, так как я думал, что это также может быть интересно.

0 голосов
/ 24 мая 2010

Одним словом, ДА, вы, вероятно, должны смотреть на что-то еще: Cassandra, Hadoop, MongoDB, что-то.

MongoDB в основном собирается сократить вашу примерную схему до «кластеров» и «новостей», а все остальное в основном содержится в этих двух.

Хорошие новости:

  1. Это позволит легко изменять поля.
  2. Операции сокращения карты естественным образом подходят для выполняемой вами работы. Вы выполняете сокращение карты, а затем сохраняете данные обратно в элемент «новости», и все будет хорошо.

Плохие новости:

  1. Легко потерять структуру данных с чем-то вроде Mongo. Hadoop и Hive обычно заставляют вашу схему немного больше. Но в любом случае вам нужно записать какую-то форму схемы или просто утопить.

  2. Если вы планируете сделать это для некоторого нетривиального объема данных, вам понадобится «горизонтальная» масштабируемость. MongoDB «в порядке» для этого, Hadoop определенно является «лидером» для этого.

0 голосов
/ 21 мая 2010

ORM означает «Объектно-реляционный картограф».Не использование реляционной базы данных не имеет большого смысла.Я притворюсь, что вы имели в виду «Я хочу иметь возможность сериализации объектов».

Я не понимаю, почему распределенность не требуется.Не могли бы вы уточнить это?

Лично я бы порекомендовал Кассандру.Он по-прежнему имеет достаточно тесные связи с Hadoop (под которым я имею в виду простоту интеграции), который вы, вероятно, в конечном итоге захотите для своей обработки.В качестве дополнительного бонуса есть Telephus, поэтому Cassandra прекрасно поддерживает Twisted.Метод разрешения конфликтов в Cassandra (в настоящее время временные метки, векторные часы скорого выхода) может работать для вашей изменяющейся метрики, если вы не возражаете получить старое значение, пока метрика не была пересчитана.В противном случае вы можете перейти на более высокий уровень и просто сохранить несколько версий данных с разными версиями метрики.Таким образом, если вы решите, что показатель является плохой идеей, вам не нужно пересчитывать.

Кассандра, к сожалению, еще не имеет чего-то, что очень хорошо сериализует / десериализует объекты.Тем не менее, для тонких оболочек, которые вы пишете (по существу, строится несколькими методами), действительно ли было бы так сложно написать fromCassandra @classmethod?

0 голосов
/ 22 мая 2010

Postgresql может быть "основан на схеме", но кажется, что вы выплескиваете ребенка из воды. Если вам не нужен распределенный БД или проект без схемы (что звучит не так, как вы, но кажется, что вы это делаете), тогда я не уверен, почему вы захотите mongodb. Postgres имеет множество опций индексирования, и, похоже, его встроенный полнотекстовый поиск будет полезен для вас. Если вы привыкли к MySQL, и изменение таблиц (вы упомянули там проблемы) может стать кошмаром, в основном лучше в Postgres. Я фанат Postgres и MongoDB - просто не похоже, что есть веская причина отказаться от реляционных БД для данных, которые, безусловно, звучат как реляционные по своей природе.

0 голосов
/ 21 мая 2010

Как насчет db4o? db4o

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...