2010-05-21 106 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關係,因爲我認爲這也可能很有趣。