4

Stack Overflow に似たモデルのアプリケーションを開発しています (質問/回答など...) C#/ASP.net MVC を使用した NoSQL フォーラム アプリケーションのモデル化

モデルは次のようになります(簡略化)

class Question
{
    public string Title { get; set; }
    public string Body { get; set; }
    public DateTime DateCreated { get; set; }

    public string UserName { get; set; }

    public List<Answer> Replies { get; set; }
}

class Answer
{
    public string Body { get; set; }
    public DateTime DateCreated { get; set; }

    public string UserName { get; set; }
}

つまり、私のドキュメントは、「回答」が埋め込まれた 1 つのドキュメントにすぎません。

このアプローチ用にリポジトリを設計しようとしています。

2 つの別々のリポジトリが必要ですか? 例えば:

interface IQuestionRepository
{
    void PutQuestion(Question question);
    Question GetQuestion(string questionID);
}  

interface IAnswerRepository
{
    void PutAnswer(string questionID, Answer Answer);
    Answer GetAnswer(string answerID);
}

またはこのようなもの:

interface IPostRepository
{
    void PutQuestion(Question question);
    Question GetQuestion(string questionID);
    void PutAnswer(string questionID, Answer Answer);
    Answer GetAnswer(string answerID);
}
4

3 に答える 3

6

あなたのモデルは本質的に欠陥があります。

質問はルート ドキュメントである必要があります。

回答はルート ドキュメントである必要があります。

RavenDB に関して書かれていますが、ドキュメント モデリング情報はほとんど直接使用できます

編集: FWIW モデルに欠陥がある理由は、ドキュメント データベースでトランザクション境界をモデル化する必要があるためです。スタック オーバーフローを伴う編集シナリオを考えてみてください。また、ルート ドキュメントをすべて変更する回答を複数の人が追加および更新し、投稿者が質問を更新することで一貫性を維持するのは、どれほどの悪夢であるかを考えてみてください。単一のオブジェクトに対する競合の量は非常に問題になります。

RavenDB は、このような問題を解決するために、ドキュメント全体ではなくドキュメント構造の一部を正確に操作できるようにする「パッチング」と呼ばれるものを提供しますが、この設計は、ドキュメントの複雑さを大幅に増やして機能させようとするのではなく、最初から避けるのが最善です。永続化モデルは、部分的な更新を行い、精巧な同時実行状況を処理する必要があります。

この後に特定の質問に答えるには、AnswersRepository と QuestsionsRepository があります。

于 2010-12-29T20:17:23.623 に答える
0

集約ルートごとにリポジトリを作成する方が良いと思います(質問文書のみ)

于 2010-12-29T14:32:30.027 に答える
-1

Answer のリポジトリは必要ありません。ドメインの観点からは、質問オブジェクトに回答を追加するだけです。質問は集約ルートのように見え、集約ルートごとに (エンティティごとではなく) リポジトリを持つ必要があるため、質問リポジトリがその役割を果たします。

Anemic Domain Modelを作成しないように注意する必要があります。

于 2010-12-29T20:27:51.343 に答える