MongoDBの束瞛でダりン

私たちの倚くはか぀お熱意を持っおMongoDBを習埗するために駆け぀けたした。本圓に矎しいのは䟿利なJSON圢匏であり、柔軟なスキヌム正確には完党な䞍圚です。 しかし、しばらくしお、すでにMongoが確実に「保護」されおいるずき、倱望がプロゞェクトに蚭定されたす。 最も単玔なク゚リでは、ドキュメントを絶えず突く必芁があり、もう少し耇雑なク゚リでは、1日の䜜業時間をほが終わらせるこずができたす。たた、異なるコレクションに参加する必芁がある堎合は...



そしお今、誰かがJSONの郚分的なサポヌトでPostgresに戻っおきおいたす...



しかし、幞いなこずに、それはすでに停造されおおり、Mongoの本栌的な代替品であり、本栌的な半構造化ビッグデヌタDBMS AsterixDBはすでに急いでいたす。 このプロゞェクトは、䌝説的なDBMSのパむオニアであるMichael Stonebreakerの芋習いであるUCI教授Michael Careyが䞻導しおいたす。



このプロゞェクトは、単にビッグデヌタの分野における研究むニシアチブずしお始たり、圓初はMapReduceずSQLの共通スタックの䜜成に焊点を圓おおいたした。 しかし、ほんの数幎前、ビッグデヌタJSON DBMSを構築するこずが決定されたした。 Michael Careyによるず、「AsterixDBはMongoで正しく凊理されおいたす。」AsterixDBの䞻な機胜は䜕ですか



1.スキヌム。 はい、スキヌムはただ有甚であり、完党に取り陀く必芁はありたせん。 JSONリポゞトリでは、フィヌルドの䞀郚は事前に知られおおり、修正されおおり、倉曎できたせん。 しかし、圓然、Asterixはデヌタスキヌム党䜓を完党に蚭蚈するこずを匷制したせん。 あなたはスキヌムなしで生き続けるこずができたす。 ただし、少し順序を倉えたい堎合は、固定されたフィヌルドをデヌタスキヌマに配眮し、残りは「オヌプン」のたたにしたす。 それは䜕を䞎えたすか 挿入䞭のデヌタのチェック、よりコンパクトなストレヌゞ、デヌタのある堎所の芖芚的衚珟。



䟋



タむプTwitterUserTypeをopen {ずしお䜜成したす。
        スクリヌン名文字列、
         lang文字列、
         friends_countint32、
         statuses_countint32、
        名前文字列、
         followers_countint32
     }




TwitterUserTypeデヌタ型を䜜成し、リストされおいるすべおのフィヌルドは固定されおいたすが、型が開いおいるため、任意の他のフィヌルドを远加できたす。 これで、このタむプに基づいお、「芪」タむプを䜜成できたす。



タむプTweetMessageTypeを閉じたものずしお䜜成{
         tweetid文字列、
        ナヌザヌTwitterUserType、
        送信者の堎所ポむント、
        送信時間日時、
        参照トピック{{string}}、
        メッセヌゞテキスト文字列
     }




ここでは、タむプがTwitterUserTypeに察応する「ナヌザヌ」フィヌルドが衚瀺されたす。 コヌドには登りたせんでしたが、名前付きの型に割り圓おるこずなく、ネストされた構造をすぐに蚘述するこずは可胜だず思いたす。 しかし、そうでなくおも、私はそのような機胜がすぐに珟れるず確信しおいたす。



ああ、はい、AsterixDBでサポヌトされおいるデヌタ型







さお、ネストされたタむプ





2.リク゚ストの蚀語 Mongoのどこかで、デヌタをグルヌプ化し、集蚈し、蚈算されたフィヌルドで補完された゜ヌスフィヌルドの特定のサブセットを䜜成する必芁がありたす。 その埌、ひどい頭痛が始たりたす。 そのため、AsterixDBには、緩やかに構造化されたデヌタ専甚に蚭蚈されたすべおのSQL機胜を備えた本栌的なク゚リ蚀語がありたす。 これは、XML DBMSで䜿甚される機胜的なXQueryク゚リ蚀語の簡略化です。 XQueryのW3C仕様に取り組むよう読者を掟遣する぀もりはありたせんが、もし望むなら、Wellcomeに AQL蚀語Asterix Query Languageのミニチュヌトリアルを䜜成しおみたす。



ク゚リ蚀語の基瀎は、FLOWRほが花呜什For-Let-OrderBy-Where-Returnです。 ここにもGroupByを挿入したすが、少し埌で説明したす。 これをSQLに倉換するず、次のようになりたす。



SQLのほがFROM句の堎合、ここで実行するコレクションを遞択したす。 Forの埌、倀を持぀倉数のテヌブルを取埗し、その䞊に、ほずんどSQLのように、残りの操䜜が適甚されたす。



䟋埌



for $x in users, $y in groups







次の圢匏で゚ントリを取埗したす。



($x : user1, $y : group1), ($x : user1, $y: group2), ...







これは、SQLの通垞のクロス積です。



Letは远加の句です。ここでは、新しい倉数を入力できたす。 これは、ForタプルをFor結果に远加するのではなく、単に新しい倉数ずその倀を远加するだけです。



OrderBy-すべおがシンプルで、SQL゜ヌトず同等です。



Where-再び、通垞のフィルタヌ、SQL Whereの完党な類䌌物。



戻る-ここでは、正確に䜕を返したいかを尋ねたす。 垞に列のリストを返すSQLずは異なり、ここではJSON構造をブロックできたす。 そしお、この句では、結果が異なる断片を生成するネストされたク゚リをバングで䜿甚したす。



䞊蚘のすべおが動揺しないこずを願っおいたす。いく぀かの䟋を芋おみたしょう。 最初に最も原始的なもの



デヌタセットFacebookUsersの$ナヌザヌ甚
ここで、$ user.id = 8
 $ナヌザヌを返す




FacebookUsersコレクションを遞択したずころ、これはMongoず同等ですdb.FacebookUsers.find{"id"8}



より倚くの萜曞きがありたすが、これは単玔なク゚リ甚です。 ブリキが始たるず、リク゚ストの敎理がずっず簡単になりたす。



リク゚ストはより興味深いものになりたした。ここで、結合を実行し、出力に新しいデヌタ型を䜜成したす。



デヌタセットFacebookUsersの$ナヌザヌ甚
デヌタセットFacebookMes​​sagesの$メッセヌゞ
ここで、$ message.author-id = $ user.id
åž°ã‚‹
   {
     「uname」$ user.name、
     「メッセヌゞ」$ message.message
   };




すべおが明らかなようですよね 結合条件を蚭定するナヌザヌ/メッセヌゞのペアを介しお実行する堎合、returnはunameおよびmessageフィヌルドを含む新しいJSONオブゞェクトを䜜成したす。



次に、unameフィヌルドを䜿甚しお、1人のナヌザヌのすべおのメッセヌゞを1぀のJSONオブゞェクトにグルヌプ化したす。



デヌタセットFacebookUsersの$ナヌザヌ甚
 let $ messages= 
    デヌタセットFacebookMes​​sagesの$メッセヌゞ
    ここで、$ message.author-id = $ user.id
     $ message.messageを返したす
åž°ã‚‹
   {
     「uname」$ user.name、
     「メッセヌゞ」$メッセヌゞ
   };




ここで、サブク゚リをletに倉曎し、すべおのナヌザヌメッセヌゞのリストを$ messages倉数に割り圓おたした。 同じこずを実珟する別のオプション



 デヌタセットFacebookUsersの$ナヌザヌ甚
åž°ã‚‹
   {
     「uname」$ user.name、
     「メッセヌゞ」 
              デヌタセットFacebookMes​​sagesの$メッセヌゞ
              ここで、$ message.author-id = $ user.id
               $ message.messageを返したす
   }; 




個人的には、リク゚ストの2番目の圢匏の方が奜きです。デヌタを「事前に」準備しおオブゞェクトに挿入する代わりに、すぐにネストされた匏を蚘述したす。



AQLにはGroupByコンストラクトもありたすが、実際にはネストされたク゚リに眮き換えられおおり、必芁ではありたせんただし、モノがあれば䟿利です。 䞀方、GroupByを䜿甚するずク゚リの最適化が向䞊する可胜性が最も高くなりたすが、これはすでに効率の問題です。



実際、AQLの基本に぀いお説明したした。最埌のク゚リを䜜成したす。



  
  デヌタセットTwitterUsersの$ナヌザヌ甚
   $ user.nameで区別
   $ user.followers_count descによる泚文
  制限2
   $ナヌザヌを返す




ここでは、いく぀かの暙準SQLチップを䞀床に芋るこずができたす-明確な、䞊べ替え、制限。 リク゚ストが䜕をしおいるのかは明らかです。たず、ナヌザヌ名で重耇を削陀し、䞊べ替え、最初の2぀の倀を返し、結果を䜜成したす。



䜕を忘れたしたか 集蚈 ここではすべおが非垞に簡単です-集蚈は、倀のリストを入力ずしお受け取るAQLの単なる通垞の関数です。 AsterixDBには、おなじみのすべおの集蚈が含たれ、同時に2぀のバヌゞョンがありたす。完党にSQLず互換性があり、より人間的ですSQLは集蚈内でNULLを凊理する方法を芚えおいたすか そしおもちろん、自分で曞くこずもできたす。



AsterixDBで他に良いこずは䜕ですか ク゚リ凊理システムの基瀎であるAlgebrixレむダヌは、将来的に分散DBMS向けの高品質なコストベヌスのク゚リオプティマむザヌを䜜成できる柔軟な代数システムです。 最適化は開発の初期段階にありたすが、むンデックスは適切に遞択されおいるようですが、統蚈情報ず実際の最適化はただありたせんただし、ク゚リのヒントによっお蚱容可胜な結果を​​埗るこずができたす。 Indeskにもいく぀かのタむプがありたす-Bツリヌ、キヌワヌド-党文怜玢甚のむンバヌテッドリスト、ゞオメトリ甚のRツリヌ、同様の怜玢甚のn-gram。



AsterixDBはJavaで蚘述されおいたす。Pythonを愛する人のために、JavaたたはJythonのいずれかにUDFナヌザヌ定矩関数を远加できたす。



Asterixの䞀貫性はやや匱く、MongoDBのように、個々のドキュメントのレベルでACIDが䜿甚されたす。 䞀連のドキュメントたたはコレクションに圱響するトランザクションサポヌトプランはありたせん。 はい、それはすべおの人に合っおいるようです。



さお、今、原則ずしお、MongoDBからより䞀般的なプラットフォヌムに移行するこずが可胜になるずいう垌望の火花を願っおいたす。シヌドされ、開発者が戊うのを埅぀たで残りたす。



ただ完了しおいないものは䜕ですか



フォヌルトトレランスを備えた真のレプリケヌションはただ完了しおいたせん。 APIを䜿甚したデヌタベヌスからの結果のストリヌミングはありたせんこれで問題はありたせんが、倖郚リク゚ストの堎合、システムは結果党䜓を自分甚に「準備」し、REST APIを䜿甚しお返したす。 クラむアントラむブラリはただありたせん。 統蚈の収集から始めお、ク゚リの最適化に関する倚くの䜜業が残っおいたす。 たあ、おそらく小さなタスクの海。



したがっお、傍芳者を埅ちたくない堎合は、袖をたくり䞊げお、このクヌルなこずを終わらせるのを手䌝うこずができたす。



Asterix DBMS



All Articles