Структура иерархических категорий C # - PullRequest
1 голос
/ 16 декабря 2009

Я занимаюсь разработкой небольшого приложения на C # для окон и нуждаюсь в проектировании структуры иерархических категорий. В настоящее время я использую один слой Категории из БД, т.е. нет дочерних категорий. Я хотел бы пойти и позволить пользователю создавать несколько категорий уровней. Я заглянул в эту ветку Структура данных для категории , но я подумал, есть ли более простой способ решения этой проблемы? потому что я не уверен, что это будет лучшим решением проблемы.

Буду признателен, если кто-нибудь предоставит структуру таблицы БД и некоторый код на C #, который будет ей соответствовать. Также я хотел проверить, могу ли я получить все идентификаторы дочерней категории (включая дочерние дочерние элементы) от его родителя.

Ответы [ 5 ]

4 голосов
/ 16 декабря 2009
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;
}

Это наивное решение для создания дерева, и когда вы переиджируете иерархию объектов, для этого решения потребуется куча выборок из БД. Вам также необходимо хранить некоторую информацию, которая сократит количество выборок, и запомнить порядок узлов в дереве.

У Джо Селко написано совсем немного на деревьях SQL, которые будут гораздо более ценными, чем все, что я могу напечатать Я нашел эту ссылку, просматривая " Больше деревьев и иерархий в SQL " на sqlteam.com

0 голосов
/ 21 декабря 2009

Harvinder,

Структура базы данных, о которой вы думаете, будет работать отлично, но у нее есть несколько недостатков:

  • простой sql-запрос, позволяющий найти все дочерние элементы указанного узла, невозможен (вам придется выполнять строковые операции)
  • Сортировка по количеству дочерних элементов невозможна из SQL-запроса
  • чтобы получить коллекцию дочерних узлов, вам нужно будет подключиться к базе данных несколько раз (чтобы получить каждого дочернего элемента по его идентификатору)
  • и т.д..

Самая распространенная практика - хранить один идентификатор (родительский) в одном столбце. В этом случае несколько детей могут указывать на одного и того же родителя (отношение один ко многим), что эффективно решает вашу проблему.

На вторую часть вашего вопроса можно легко ответить: если вы действительно не обязаны это делать, не используйте Windows Forms (оба автора использовали его) - вы обнаружите, что крайне устали привязывать свою структуру данных к вашему представлению. Намного лучше использовать WPF для ваших целей и гибко модифицировать Combobox и Treeview Datatemplates, чтобы соответствовать вашим требованиям. Если вы не знакомы с WPF, начните с этой блестящей статьи , касающейся шаблона проектирования WPF и MVVM - в ней даже есть примеры Treeview, которые будут полезны в вашем случае.

Пожалуйста, скажите мне, если мой ответ решил вашу проблему. Буду рад ответить на любые ваши вопросы, касающиеся WPF.

0 голосов
/ 18 декабря 2009

Спасибо за ответы и за внимание к прочтению моего вопроса.

В настоящее время у меня уже есть структура для настроек отдельной категории, довольно легко, я знаю. Я думал о том, чтобы выбрать немного более простой маршрут (я думаю, что это более простой маршрут, но он может быть неправильным).

В настоящее время я думаю о добавлении дополнительного столбца в таблицу категорий с именем children_ids. Так что все родители будут вести учет детей там, а не наоборот. Столбец children_ids может иметь текстовый тип, а идентификаторы могут храниться в строковом формате, т.е. 1-4-5-7-8 и т. Д., И как только я получу этот столбец из БД, я могу разбить строку с помощью '-' и получить все идентификаторы для его детей.

Я думаю, таким образом мне будет немного легче следить за всем населением;), просто спросите родителей о своих детях. Я думаю, что это также облегчит поиск зависимостей, потому что мне нужно будет только получить список всех детей (все уровни ниже рекурсивно) быстрее, я думаю. Таким образом, я также могу отсортировать все файлы перед их загрузкой из БД, еще одна головная боль прошла.

Я уверен, что должны быть лучшие решения, но не знаю, будет ли это проще или нет.

Мое другое требование состояло в том, чтобы создать выпадающий выпадающий список с этой категорией дочерний родительский стиль, подобный структуре списка папок, чтобы пользователи могли выбирать между ними. Может быть, что-то вроде Пример CodeProject или Пример CodeGuru , я мог бы использовать один из подходов, чтобы сделать мою жизнь немного проще.

Проблема в том, что я хотел бы добавить больше деталей в каждую запись раскрывающегося меню, например, cat_id и т. Д., Но не хочу, чтобы они были видны пользователю, это для получения подробных сведений о выбранных пользователях. Я предполагаю, что мне придется компенсировать это, имея отдельный ArrayList, возможно, со всеми деталями категорий, а затем просто перейти к его местоположению индекса, как только пользователь выберет запись из выпадающего списка. Думал ли я прямо?

Спасибо за чтение и за ответы!

0 голосов
/ 16 декабря 2009

Harvinder,

Рассматривали ли вы использование элемента управления TreeView для своих целей? Я думаю, это была бы идеальная идея. Пожалуйста, посмотрите на сайт MSDN относительно управления TreeView. Нажмите здесь .

0 голосов
/ 16 декабря 2009

Если ваша иерархия жесткая и не изменится, вы можете жестко ее кодировать.

Поток касается иерархий, которые являются текучими и могут постоянно меняться, и в этом сценарии обсуждаемые решения являются подходящими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...