2012-04-30 5 views
9

Reddit в настоящее время переносит свою базу данных из PosgreSQL в Apache Cassandra. Кто-нибудь знает, какая схема базы данных использует Reddit в Cassandra?Что такое схема базы данных Cassandra, используемая в Reddit?

+0

Я этого не делаю, и я не уверен, что кто-то за пределами Реддит делает, но разве это действительно важно? Я ожидаю, что здесь очень много людей на SO могут помочь определить схему, подходящую для * вашего * приложения. –

+2

Reddit опубликовал код, который активирует сайт на GitHub: https://github.com/reddit/reddit. Я мог искать в коде и определять схему оттуда. Но я подумал, что здесь легче спросить. –

+1

Я просмотрел код, и я вижу что-то вроде двух десятков разных колоний, которые создаются и используются по-разному. Есть ли какая-то область, о которой вы думаете, или вы больше ищете что-то вроде вывода show schema из cassandra-cli? –

ответ

-1

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

В CouchDB и MongoDB вы можете хранить документы JSON напрямую. В Кассандре я сохранил бы JSON как строку. Таким образом, структура данных будет только

root-comments 
{ 
    root-comment-id 
    root-comment-json-string 
} 

и каждый корень-комментарий-JSON-строка будет выглядеть следующим образом:

{ 
comment : "hello world" 
answers : 
[ 
    { 
    comment : "reply to hello world" 
    answers : 
    [ 
     { 
     comment : "thanks for the good reply" 
     answers : [] 
     }, 
     { 
     comment : "yes that reply was indeed awesome" 
     answers : [] 
     } 

    ] 
    } 

] 
} 

дополнительно вы можете добавить UserName, UserID, Timestamp, .. .. и т. д. к структуре каждого комментария.

Эта «денормализованная» структура сделает запросы очень быстрыми по сравнению с нормированной реляционной структурой, если у вас есть МНОГО данных.

В любом случае вам придется позаботиться обо всех исключениях, которые могут возникнуть при реализации такой системы для крупной пользовательской шкалы, например. Что произойдет, если кто-то ответит на комментарий A с комментарием B, но в то же время (или позже) комментарий A будет удален.

Если вы ищете в Интернете для «иерархических данных кассандры», вы найдете некоторые другие подходы, но все они возвращаются к нормализации или они не полны для «бесконечной» иерархии.

+1

Проблема с описанным вами подходом заключается в том, что в любое время добавления нового комментария вам необходимо обновить JSON, то есть проанализировать его, объединить в нем комментарий и затем записать его в Cassandra. Представьте себе дерево с тысячами комментариев. Таким образом, этот подход дешевле для извлечения, но дорогостоящий при обновлении. Реляционный подход - это наоборот, дорогой при получении дерева комментариев и дешево при обновлении. Я думаю, что лучший подход - это гибридный, хранить самые импортные комментарии, как вы описываете, и наименее важные в реляционной манере. –

+1

@ Calin-AndreiBurloiu Да, правда. Насколько я понимаю, такая система комментариев (например, reddit) имеет гораздо больше информации, чем обновления. Поэтому мой ответ - это точно правильное решение. –

+0

И синь результата можно легко сделать в JavaScript на клиенте, так как это JSON. –