0

我目前正在使用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 个类似的废话表,这增加了太多额外的维护层复杂性)。

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

4

5 回答 5

1

当模式变得复杂时,图形数据库可能是一个不错的选择。据我了解您的域,您有许多以不同方式与其他实体相关的实体。将其建模为实体图/网络对您有意义吗?作为思考的食物,我使用Neo4j举了一个例子:

新闻分析示例 http://github.com/neo4j-examples/domain-models/raw/master/news-analysis.png

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

于 2010-05-24T09:28:20.550 回答
0

db4o 怎么样?db4o

于 2010-05-21T18:48:29.363 回答
0

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

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

就个人而言,我会推荐 Cassandra。它仍然与 Hadoop 有相当密切的联系(我的意思是易于集成),您最终可能会想要它来进行处理。作为额外的奖励,还有 Telephus,所以 Cassandra 非常支持 Twisted。Cassandra 的冲突解决方法(目前是时间戳,即将推出的矢量时钟)可能适用于您不断变化的指标,只要您不介意在未重新计算指标的情况下获取旧值。否则,您可能会提升一个级别,并使用不同版本的度量标准存储多个版本的数据。这样,如果您认为某个指标是一个坏主意,您就不必重新计算。

不幸的是,Cassandra 还没有能够很好地序列化/反序列化对象的东西。但是,对于您将要编写的瘦包装器(基本上是带有一些方法的结构),编写 fromCassandra @classmethod 真的有那么大吗?

于 2010-05-21T18:55:09.867 回答
0

Postgresql 可能是“基于模式的”,但感觉就像是在把婴儿和洗澡水一起扔出去。如果您不需要分布式数据库或特别无模式的设计(这听起来不像是随手做的,但您似乎认为自己需要),那么我不确定您为什么需要 mongodb。Postgres 有很多索引选项,听起来它内置的全文搜索对你有好处。如果您习惯于 MySQL 并更改表(您提到了那里的问题)可能是一场噩梦,主要是它在 Postgres 中更好。我是 Postgres 和 MongoDB 的粉丝——听起来似乎没有充分的理由从关系数据库中移出关系数据库,而这些数据在本质上听起来确实是关系性的。

于 2010-05-22T07:05:39.187 回答
0

总而言之,是的,您可能应该关注其他东西:Cassandra、Hadoop、MongoDB 等等。

MongoDB 基本上会将您的示例模式简化为“集群”和“新闻”,其他所有内容基本上都包含在这两者中。

好消息:

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

坏消息:

  1. 使用 Mongo 之类的东西很容易忘记数据的结构。Hadoop 和 Hive 通常会更多地强制您的架构。但在任何情况下,您都需要写下某种形式的模式,否则就会被淹没。

  2. 如果您打算对一些重要的数据量执行此操作,那么您将需要“水平”可伸缩性。MongoDB 在这方面“还可以”,Hadoop 在这方面绝对是“领导者”。

于 2010-05-24T06:44:10.660 回答