0

エントリのカテゴリを持つアプリケーションに取り組んでいます。各エントリには、正確に 1 つのカテゴリがあります。私の懸念は、最もクリーンなコードとデザインでそれを達成するために、カテゴリをモデル化する方法です。

これは、私が Category エンティティを実装することを考えていた方法です -アプローチ 1 :

public class Category : Entity
{
    public string Name { get; set; }
    public string Desc { get; set; }
    public int GuiOrder { get; set; }
    public List<Category> Categories { get; set; }
}

ネストされたカテゴリを実現し、この方法でインスタンス化するには:

    var cat1 = new Category()
    {
        Name = "Bikes", 
        Desc = "Mountain, city, you-name-it we have it bikes.", 
        GuiOrder = 1,
        Categories = new List<Category>()
        {
            new Category()
            {
                Name = "Sub 1",
                Desc = "Sub 1 description.",
                GuiOrder = 1,
                //Id = 
            }
        }
    };

これは、ドキュメントが MongoDB でどのように表示されるかも同じです。「Sub 1」でわかるように、Id はコメント アウトされています。これは、ネストされたカテゴリのこのエンティティ定義では MongoDB がキーを生成しないため、次のようなアプリケーションで明示的に行う必要があるためです。

subCat1.Id = new BsonObjectIdGenerator().GenerateId(categoryRepository.Collection, subCat1).ToString();

オブジェクト初期化子に「subDocument1」への参照がないため、後で行う必要があります。オブジェクトを送信する前に、再帰的に問題を解決します。これは少し厄介なようです。

別の方法として、次のエンティティ定義を行うこともできます (アプローチ 2 )。

public class Category : Entity
{
    public string Name { get; set; }
    public string Desc { get; set; }
    public int GuiOrder { get; set; }
    public Category Parent { get; set; }
}

カテゴリがフラット化されたので、これは実際にはリレーショナル アプローチであり、ここで気に入らないのは、Mongo が ObjectId のみではなく、オブジェクト全体を挿入することです。

{
        "_id" : ObjectId("53413657e42c3c16582cda70"),
        "Name" : "Bikes",
        "Desc" : "Mountain, city, you-name-it we have it bikes.",
        "Parent" : null
}
{
        "_id" : ObjectId("53413657e42c3c16582cda72"),
        "Name" : "Sub 1",
        "Desc" : "Sub 1 description.",
        "Parent" : {
                "_id" : ObjectId("53413657e42c3c16582cda70"),
                "Name" : "Bikes",
                "Desc" : "Mountain, city, you-name-it we have it bikes.",
                "Parent" : null
        }
}
{
        "_id" : ObjectId("53413657e42c3c16582cda73"),
        "Name" : "Sub 2",
        "Desc" : "Sub 2 description.",
        "Parent" : {
                "_id" : ObjectId("53413657e42c3c16582cda70"),
                "Name" : "Bikes",
                "Desc" : "Mountain, city, you-name-it we have it bikes.",
                "Parent" : null
        }
}

したがって、私の懸念は次のとおりです。アプローチ1の場合、カテゴリを効率的に検索するにはどうすればよいですか(カテゴリは約4レベルでネストされます)。機能について、「このカテゴリのすべてを表示する」としましょう... アプリケーション レベルで ObejctId を割り当てることは非常に悪い習慣ですか? これにはシャーディングが必要になるとは思えません...

または、アプローチ 2 では、「メイン」カテゴリが変更された場合はどうなりますか? - いくつかの場所で変更する必要があります。また、非常に面倒で繰り返しになる可能性のある深いヒエラルキーもあります。

どのソリューションが優れているか、改善案は何かについてフィードバックをいただければ幸いです。どこで問題が発生する可能性がありますか? 見栄えを良くするため - これらのカテゴリはあまり変更されません (操作用の UI を実装していない可能性さえあります)。

4

0 に答える 0