0

我正在开发一个具有条目类别的应用程序。每个条目将只有一个类别。我关心的是如何对类别进行建模,以便以最简洁的代码和设计实现这一目标。

这就是我想实现 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 将插入整个对象,而不仅仅是 ObjectIds:

{
        "_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