我正在开发一个小型的C#windows应用程序,并且需要Hierarchical Categories结构设计。我目前使用来自DB的单层类别,即没有子类别。我想继续并允许用户创建多个级别的类别。我查看了这个帖子Data structure for Category,但我在想是否有更简单的方法来处理这类问题?因为我不确定这是否是问题的最佳解决方案。
如果有人能提供数据库表结构和一些C#代码代码,我将不胜感激。此外,我想检查我是否能够从其父母那里获得所有子类别ID(包括子孩子)。
答案 0 :(得分: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;
}
这是一个创建树的天真解决方案,当您为对象层次结构重新水化时,该解决方案将需要一堆数据库选择。您还需要存储一些可减少选择次数的信息,并记住树中节点的顺序。
Joe Celko在SQL树上有written quite a bit,它比我能输入的任何东西都更有价值。我在sqlteam.com上查看“More Trees & Hierarchies in SQL”时发现了这个链接
答案 1 :(得分:0)
如果你的层次很僵硬而且不会改变,你可以硬编码。
线程是关于层次结构的流动性,可能会不断变化,在这种情况下,所讨论的解决方案是合适的。
答案 2 :(得分:0)
Harvinder,
您是否考虑过将TreeView控件用于您的目的?我想这将是一个完美的主意。请查看有关TreeView控件的MSDN站点。 Click here
答案 3 :(得分:0)
感谢您回答和考虑阅读我的问题。
我目前已经有了单一类别设置的结构,我知道这很简单。我正在考虑采用一种稍微简单的路线(我认为路线更简单,但可能是错误的)。
我目前正在考虑在类别表中添加一个名为children_ids的额外列。因此,所有的父母都会记录那里的孩子,而不是相反。我的children_ids列可以是Text类型,id可以以字符串格式存储,即1-4-5-7-8等。一旦我从DB中获取此列,我可以用' - '分割字符串并获取所有孩子的ids。
我认为通过这种方式,我可以更容易地关注所有人群;),只要向父母询问他们的孩子。我认为这也将减轻依赖性系列,因为我只需要更快地得到所有孩子的列表(递归以下的所有级别)。通过这种方式,我可以在将所有内容从数据库中加载之前对其进行排序,这又一次令人头疼。
我确信必须有更好的解决方案,但不知道它是否更容易。
我的另一个要求是使用此类别的父级样式创建下拉组合框,类似于用户可通过它们选择的文件夹列表结构。也许像CodeProject example或CodeGuru example之类的东西,我可能会使用其中一种方法让我的生活变得更轻松。
问题是我想在下拉菜单的每个记录中添加更多细节,即cat_id等,但不希望它们对用户可见,这是为了获取用户选择的详细信息。我想我必须通过拥有一个单独的ArrayList来补偿它,可能包含类别的所有细节,然后只要用户从下拉列表中选择一条记录就转到它的索引位置。我在想吗?
感谢阅读和回复!
答案 4 :(得分:0)
Harvinder,
您正在考虑的数据库结构将完美运行,但它有一些缺点:
最常见的做法是将单个ID(父级)存储在一列中。在这种情况下,多个孩子可以指向同一个父级(关系一对多),这可以有效地解决您的问题。
您的问题的第二部分可以轻松回答:除非您真的必须这样做,否则不要使用Windows窗体(两位作者都使用过它) - 您会发现自己非常疲惫地将数据结构绑定到您的视图。将WPF用于您的目的并灵活地修改Combobox和Treeview Datatemplates以满足您的要求是一个好主意。如果您不熟悉WPF,请首先查看有关WPF和MVVM设计模式的brilliant article - 它甚至包含一个Treeview示例,这将对您的案例有所帮助。
请告诉我,我的答案是否解决了您的问题。我很乐意回答您关于WPF的任何问题。