1

自然言語データベースの MongoDB スキーマ設計についてアドバイスが必要です。

次のような各言語のテキストと単語を保存する必要があります。

lang: {
    _id: "English",
    texts : [
        {   text : "This is a first text", 
            date : Date("2011-09-19T04:00:10.112Z"),
            tag : "test1"
        },
        {   text : "Second One", 
            date : Date("2011-09-19T04:00:10.112Z"),
            tag : "test2"
        }
    ],
    words : [
        {   
            word : "This",
        },
        {   
            word : "is",
        },
        {   
            word : "a",
        },
        {   
            word : "first",
        },
        {   
            word : "text",
        },
        {   
            word : "second",
        },
        {   
            word : "one",
        }


    ]

}

次に、ユーザーが関連付けた各単語とテキストを知る必要があります。単語/テキストの量は膨大になる傾向があり、ある言語のすべての単語と、ユーザーがその言語に関連付けたすべての単語をリストする必要があります。

私の観点からは、特定の単語に関連付けられている user_ids をその単語の配列に格納することは、次のような良いアプローチだと思います。

lang: {
    _id: "English",
    texts : [
                ...
    ],
    words : [
        {   
            word : "This",
            users: [user1,user2,user3]
        },
        {   
            word : "is",
                users: [user1,user2]
                },
                ...
    ]
}

単語は何十万ものユーザーに関連付けることができ、ドキュメントの制限 (私が読んだように) は 4MB であり、次のことを行う必要があることを念頭に置いてください。

  1. 特定のユーザーと言語のすべての単語を一覧表示する

これは良いアプローチですか?それとももっと良いものを考えられますか?

この質問が十分に明確であり、誰かがこれについて私に助けてくれることを願っています;)

皆さん、ありがとうございました!

4

2 に答える 2

4

あなたが言及した理由から、これは良いアプローチではないと思います:ドキュメントサイズの制限。あなたのアプローチでは、間違いなく限界にぶつかるようです。私はよりフラットなアプローチを採用します(これにより、コレクションのクエリが容易になります)。このようなもの:

[
    {
        user: "user1",
        word: "This",
        lang: "en"
    },
    {
        user: "user1",
        word: "is",
        lang: "en"
    },
    // et cetera...
]

つまり、1 つのドキュメントにデータを追加して水平方向に拡張するのではなく、ドキュメントを追加して垂直方向に拡張します。db.find( { user: "user1", lang: "en" });を使用して、特定のユーザーの単語をクエリできます。.

もちろん、このアプローチは「正規化」されていないため、スペースが心配な場合は、ユーザー、単語、および言語用に別のコレクションを作成し、ID によってメイン コレクションでそれらを参照することをお勧めします。ただし、MongoDB には結合クエリがないため、クエリのパフォーマンスとスペース効率を比較検討する必要があります。

于 2012-05-21T01:14:27.583 に答える
1

dbaseman は正しい (そして賛成) ですが、他にもいくつかの点があります。

まず、 MongoDB の最近のバージョンを実行していると仮定すると、ドキュメントの制限は現在 16MB (最大ドキュメント サイズ) です。

第 2 に、MongoDB では一般に無制限の拡張は好ましくありません。このタイプのドキュメント サイズの拡張により、現在割り当てられているスペースを超えると、MongoDB がドキュメントを移動しなければならなくなる可能性があります。詳細については、ドキュメントのパディング ファクターのセクションを参照してください。

これらのタイプの移動は、特に頻繁に発生する場合、比較的コストがかかります。したがって、このタイプのデザインを使用する場合、メイン コレクション (最新の X、最も人気のある X など) に相当するコメントのサイズを制限し (基本的にその成長を制限します)、おそらくそのドキュメント フィールドを事前入力します (基本的に、手動パディング) を平均サイズを超えると、追加/変更による移動が減少します。

これが、O'Reilly の MongoDB Developers のヒントとコツの本のヒント #6 が次の理由です。

ヒント #6: 無制限の成長を伴うフィールドを埋め込まない

于 2012-05-21T11:33:21.247 に答える