什么db适合我?

时间:2010-05-21 18:36:06

标签: non-relational-database postgresql mysql mongodb

我目前正在使用mysql。我发现我的架构变得异常复杂。我寻求找到一个适合我需求的新数据库:

我们假设我正在构建一个新闻聚合器(从多个网站收集新闻)。然后我运行算法来确定来自不同站点的两条新闻是否实际上指的是同一主题。我运行此算法将新闻聚集在一起。这种关系如下所示:

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

然后我将应用一些魔法并确定每个单词的重要性。总结每个单词的所有重要性让我了解新闻文章的重要性。总结每篇新闻文章的重要性使我了解了一个集群的重要性。

请注意,上面的群集中还有子群(如按区域划分等)和类别(如体育等),我必须确定其在特定日期的重要性。

我过去曾使用过这样的观点,但我意识到观点非常缓慢。因此,我通常会在实际表中插入并对其进行索引以获得更好的性能。正如你所看到的那样,这会导致多个表派生出来,如(集群,重要性),(新闻,重要性),(单词,重要性)等,这些表格会变得非常混乱。

此外,“重要性”指标也会发生变化。更改表,更新数据(我使用TRUNCATE TABLE)然后从null插入变得越来越困难。

我目前正在研究像Mongodb这样无模式的东西。我不需要分布式。我非常想要一些速度相当快(可以编入索引)的东西,以及比传统RDMBS更灵活的东西。

根据不同的人的要求,我会将我的用法发布到这个数据库(它们不是真正的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 个答案:

答案 0 :(得分:1)

当架构变得复杂时,graph database可能是一个不错的选择。据我了解您的域名,您有许多与其他实体相关的实体以不同的方式。您是否有必要将其建模为实体的图形/网络?作为思考的食物,我使用Neo4j掀起了一个例子:

news-analysis-example http://github.com/neo4j-examples/domain-models/raw/master/news-analysis.png

在graphdb中,您可以在节点和关系上设置属性,这在您的情况下可能很有用(例如,新闻条目中使用单词的次数可以添加到与该单词的关系中)。顺便说一句,我在两个新闻项之间添加了额外的is_related关系,因为我认为这也很有趣。

答案 1 :(得分:0)

db4o怎么样? db4o

答案 2 :(得分:0)

ORM表示“对象关系映射器”。不使用关系数据库没有多大意义。我假装你的意思是“我希望能够序列化对象”。

我不明白为什么不需要分布式。你能详细说明吗?

就个人而言,我会推荐Cassandra。它仍然与Hadoop有着相当密切的联系(我的意思是易于集成)Hadoop,你可能最终会想要进行处理。作为额外的奖励,有Telephus,所以Cassandra支持Twisted精美。 Cassandra的冲突解决方法(当前时间戳,即将推出的矢量时钟)可能适用于您更改的度量标准,只要您不介意获取旧值,只要未重新计算度量标准即可。否则,您可能会向上移动一个级别,只需使用不同版本的度量标准存储多个版本的数据。这样,如果您认为某个指标不是一个好主意,则无需重新计算。

不幸的是,Cassandra没有能够很好地序列化/反序列化对象的东西。但是,对于你要编写的薄包装器(基本上是用几种方法构造),写一个来自Cassandra @classmethod真的是一件大事吗?

答案 3 :(得分:0)

Postgresql可能是“基于模式的”,但有点像你把婴儿扔出洗澡水。如果你不需要一个分布式数据库或一个特别没有架构的设计(它听起来不像你做的那样,但你似乎认为你这样做)那么我不确定为什么你会想要mongodb。 Postgres有很多索引选项,听起来它内置的全文搜索对你有好处。如果你已经习惯了MySQL并且改变了表(你在那里提到了问题)可能是一场噩梦,大多数情况下它在Postgres中更好。我是Postgres和MongoDB的粉丝 - 它听起来并不像是一个很好的理由离开关系数据库,因为数据肯定听起来是关系性的。

答案 4 :(得分:0)

总之,是的,你应该看看别的东西:Cassandra,Hadoop,MongoDB,等等。

MongoDB基本上会将你的样本架构减少为“集群”和“新闻”,其他一切基本上都包含在这两者中。

好消息:

  1. 这样可以轻松修改字段。
  2. Map-reduce操作非常适合您正在进行的工作类型。您执行map-reduce,然后将数据保存回“新闻”项目,一切都会很好。
  3. 坏消息:

    1. 使用像Mongo这样的东西很容易丢失数据结构。 Hadoop和Hive通常会强制您的架构。但无论如何,你需要写下某种形式的架构或者只是淹死。

    2. 如果您计划对某些非常重要的数据执行此操作,那么您将需要“水平”可伸缩性。 MongoDB对此非常“好”,Hadoop绝对是这方面的“领导者”。