1

我正在开发一个小型 C# windows 应用程序并且需要分层类别结构设计。我目前正在使用数据库中的单层类别,即没有子类别。我想开始并允许用户创建多个级别的类别。我查看了 Category 的这个线程数据结构,但我在想是否有更简单的方法来处理这类问题?因为我不确定这是否是解决问题的最佳方法。

如果有人可以提供数据库表结构和一些 C# 代码,我将不胜感激。我还想检查我是否能够从其父级获取所有子类别 ID(包括子子级)。

4

5 回答 5

4
create table Category
(
     id int primary key identity,
     parent_id int,
     name varchar(100),
     foreign key (parent_id) references Category (id)
)

public class Category
{
    private int id; 
    private string name;
    private Category Parent;
    private IList<Category> Children;
}

这是一个创建树的简单解决方案,当您重新处理对象层次结构时,该解决方案将需要一堆 DB 选择。您还需要存储一些可以减少选择次数的信息,并记住树中节点的顺序。

Joe Celko写了很多关于 SQL 树的文章,这些文章比我能输入的任何东西都更有价值。我在 sqlteam.com 上查看“ More Trees & Hierarchies in SQL ”时发现了该链接

于 2009-12-16T15:15:15.663 回答
0

Harvinder,

The database structure you're thinking about will work perfectly, but it has few disadvantages:

  • simple sql query finding all children of specified node is not possible (you would have to perform string operations)
  • sorting by number of children is impossible from within sql query
  • to get a collection of node's children you will have to connect to the database several times (to get every child separately by its ID)
  • etc.

The most common practice is to store single ID (parent) in one column. In this case multiple children can point at the same parent (relation one-to-many), which solves your problem efficiently.

The second part of your question can be answered easily: unless you really have to, don't use Windows Forms (both authors used it) - you will find yourself extremely tired binding your datastructure to your view. It is a far better idea to use WPF for your purpose and flexibly modify Combobox and Treeview Datatemplates to face your requirements. If you're not familiar with WPF please start by having a look at this brilliant article concerning WPF and MVVM design pattern - it does even contain a Treeview examples, which will be helpful in your case.

Please tell me if my answer solved your problem. I'd be happy to answer any of your questions concerning WPF.

于 2009-12-21T13:27:08.147 回答
0

如果您的层次结构是固定的并且不会改变,您可以对其进行硬编码。

该线程是关于流动的并且可能不断变化的层次结构,在这种情况下,讨论的解决方案是合适的。

于 2009-12-16T10:16:46.180 回答
0

感谢您阅读我的问题的答复和考虑。

我目前已经有一个单一类别设置的结构,我知道这很容易。我正在考虑采取稍微简单的路线(我认为这是更简单的路线,但可能是错误的)。

我目前正在考虑在名为 children_ids 的类别表中添加一个额外的列。这样所有的父母都会记录那里的孩子,而不是相反。我的 children_ids 列可以是文本类型,并且 ids 可以以字符串格式存储,即 1-4-5-7-8 等,一旦我从数据库中获取此列,我可以使用“-”拆分字符串并获取所有其孩子的 id。

我认为这样我会更容易关注所有人口;),只需向父母询问他们的孩子。我认为它也会减轻依赖关系,因为我只需要更快地获取所有子项(递归以下所有级别)的列表。这样,我还可以在从数据库加载它们之前对所有整体进行排序,另一个头痛消失了。

我确信那里必须有更好的解决方案,但不知道它是否会更容易。

我的另一个要求是创建一个具有此类子父样式的下拉组合框,类似于文件夹列表结构供用户通过它们进行选择。也许像CodeProject exampleCodeGuru example 之类的东西,我可能会使用其中一种方法来让我的生活更轻松一些。

问题是我想在下拉菜单的每条记录中添加更多详细信息,即 cat_id 等,但不希望它们对用户可见,这是为了获取有关用户选择的详细信息。我想我将不得不通过拥有一个单独的 ArrayList 来补偿它,它可能包含类别的所有详细信息,然后一旦用户从下拉列表中选择了一条记录,就转到它的索引位置。我想得直吗?

感谢您的阅读和回复!

于 2009-12-18T17:43:29.427 回答
0

收割机,

您是否考虑过将 TreeView 控件用于您的目的?我想这将是一个完美的主意。请查看有关 TreeView 控件的 MSDN 站点。点击这里

于 2009-12-16T11:07:00.843 回答