如何在数据库中对此类进行建模?

时间:2011-08-16 01:55:32

标签: c# sql-server database linq uml

我需要一点帮助。这是我设计的几个类别。

   Category 1
     Sub Category 1.1
       Sub Category 1.1.1
     Sub Category 1.2
     Sub Category 1.3

这将是一个集合。我想将它存储在数据库中,但我不知道如何在数据库表中对其进行建模。我正在使用SQL Server CE。

enter image description here

更新

我忘了把目标号码放在课堂上(1.1,1.1.1)。

4 个答案:

答案 0 :(得分:3)

你的桌子是这样的:

  • 类别
    • id(主键,非空)
    • name(text,not null)
    • parent_category_id(category.id的外键,可以为空)

然后,如果某个类别有父级,则引用该另一行的id。因此该表是自我指涉的。 Toplevel类别的空值为parent_category_id

在构建这样的表时,您需要注意不要创建循环引用。

答案 1 :(得分:0)

为此,您可以拥有一个表,其中项可以引用其父项(如果有)。

enter image description here

如果ParentId列为NULL,则该类别为根目录。如果没有,则引用父级。

然后,您可以通过遍历表格并搜索ParentId等于Id类别的项目来查找某个类别的子类别。

请注意,ParentId必须编入索引才能获得更好的效果,并且必须有ParentIdId的外键才能确保数据的有效性。

递归存储类别:

private void SaveCategoryRecursively(Category category)
{
    foreach (var subCategory in category.SubCategories)
    {
        query(@"
insert into [dbo].[Categories] ([Id], [ParentId], ...)
values (@id, @parentId, ...)", ...);
        this.SaveCategoryRecursively(subCategory);
    }
}

public void SaveCategories(IEnumerable<Category> rootCategories)
{
    foreach (var category in rootCategories)
    {
        query(@"
insert into [dbo].[Categories] ([Id], [ParentId], ...)
values (@id, NULL, ...)", ...);
        this.SaveCategoryRecursively(category);
    }
}

答案 2 :(得分:0)

我使用简单的Recursive Relation。每个类别应具有唯一的ID(主键)和指定其父级的可选字段,该字段将是映射回同一表的外键。父级为NULL的类别是顶级类别。

我链接到的页面还提供了有关如何查询此结构以查找顶级或中级类别的信息。

答案 3 :(得分:-2)

这是我的建议。创建三个表。我假设每个表都有不同的列

Category { Id, Name,...} 
SubCategory {Id, Name, ..., **ParentID**}  [ParentID is a FK from Category table Id Column] 
SubSubCategory {Id, Name, ...,  **SubParentID**}  [SubParentID is a FK from SubCategory table ParentID Column]