2010-05-21 58 views
0

我目前使用的是mysql。我发现我的模式变得非常复杂。我试图找到一个新的数据库,以满足我的需求:db适合我吗?

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

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

然后我会运用一些魔法并确定每个单词的重要性。总结每个单词的所有重要性都会给我一篇新闻文章的重要性。总结每篇新闻文章的重要性,给我一个集群的重要性。

请注意,上面的集群也有子组(如按区域分割等)和类别(如体育等),我必须确定在特定的一天本身的重要性。

我已经用过去的观点去做,但是我意识到观点非常缓慢。所以我通常会在实际的表格中插入一个插入索引来获得更好的性能。正如你所看到的,这会导致衍生出像表(集群,重要性),(新闻,重要性),(单词,重要性)等多个表格,这些表格会变得非常混乱。

此外,“重要性”指标也会改变。变更表格,更新数据(我正在使用TRUNCATE TABLE)然后从空白处插入变得越来越困难。

我目前正在研究像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个垃圾表组成,这为维护增加了很多额外的复杂层次)。

注意这不是关于全文搜索。

+1

什么数据库适合你?那要看。你是什​​么数据类型? – bta 2010-05-21 19:40:14

+0

向我们展示了您的模式和一些带解释计划的示例查询,然后我们可以确定它是您的设计还是数据库出错。 – 2010-05-22 07:08:35

回答

0

db4o怎么样? db4o

+0

没有真正看到这样的事情抱歉 – afvasd 2010-05-22 07:48:44

0

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

我不明白为什么分布不是必需的。你能详细说明一下吗?

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

不幸的是,Cassandra没有很好的序列化/反序列化对象。然而,对于你将要写的精简包装(本质上是用几种方法构造的),是否会写出一个来自Cassandra @classmethod的真正重要的协议?

0

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

0

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

MongoDB基本上会将您的示例架构减少为“簇”和“新闻”,其他基本上都包含在这两者中。

好消息:

  1. 这将使它更易于修改字段。
  2. Map-reduce操作非常适合您正在进行的工作类型。您执行map-reduce,然后将数据保存回“新闻”项目,一切都会好的。

坏消息:

  • 这很容易失去跟踪数据的结构与类似蒙戈。 Hadoop和Hive通常会强制你的模式更多。但无论如何,你都需要写下某种形式的模式或者只是淹死。

  • 如果您打算为某些不重要的数据执行此操作,那么您将需要“水平”可伸缩性。 MongoDB对此“确定”,Hadoop绝对是这方面的“领导者”。

  • 1

    当架构变得复杂时,graph database可能是一个不错的选择。据我了解您的域名,您有许多与其他实体相关的实体有不同的方式。将它作为实体的图形/网络进行建模是否有意义?至于回味无穷我刮起了使用Neo4j一个例子:

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

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