Отображать иерархические данные в C # - PullRequest
3 голосов
/ 15 сентября 2010

Я пытаюсь создать страницу для отображения результатов ученика / класса по предмету / учителю.

В некоторых классах есть группы, в которых есть ученики, а в некоторых - только ученики.Предмет продуман одним или несколькими учителями.Это может измениться в будущем, и я хочу сохранить дизайн как можно более гибким (т.е. предметы могут быть разбиты на модули или на отдельные результаты испытаний, классы могут быть далее сгруппированы по годам и т. Д.)

Я хочу отобразитьВ результате получается сетка, которую я могу развернуть и свернуть, чтобы усреднить результаты (класс по Y и предмет по X).

Хотя для этого нужно иметь 3 таблицы базы данных следующим образом:

**class_structure**
id (int) PK
description (varchar)
parent_id (int) FK to id

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

**subject_structure**
id (int) PK
description (varchar)
parent_id (int) FK to id

Самый высокий уровень - это предмет, самый низкий - учитель

**results**
id (int) PK 
class_structure_id (int) FK
subject_structure_id (int) FK
date (datetime)
reult (int)

Что вы думаете о вышеупомянутой структуре?Я полагаю, что это дает мне гибкость в будущем?

В моем приложении asp.net я запрашиваю наивысший уровень структуры класса и усредняю ​​все результаты ниже этого (лучше мне сделать это усреднение в спроке вБД или использовать, скажем, LINQ в приложении?)

Это вернет мне набор результатов на самом высоком уровне.

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

<table border="1" padding="2">
 <tr>
  <td></td>
  <td></td>
  <td colspan="2" align="center">Subj 1</td>
  <td colspan="2" align="center">Subj 2</td>
 </tr>

 <tr>
  <td></td>
  <td></td>
  <td>Teacher 1</td>
  <td>Teacher 2</td>
  <td>Teacher 1</td>
  <td>Teacher 2</td>
 </tr>
 <tr>
  <td rowspan="2">Class 1</td>
  <td>Student 1</td>
  <td>90</td>
  <td>55</td>
  <td>75</td>
  <td>100</td>
 </tr>
 <tr>
  <td>Student 2</td>
  <td>40</td>
  <td>95</td>
  <td>65</td>
  <td>39</td>
 </tr>
</table>

Затем, когда пользователь нажал на первый класс, это развернется и покажет все группы (если таковые имеются, студенты, если нет)) (передать class_structure_id выбранной ячейки в тот же метод / sproc и получить эти результаты), а затем перерисовать таблицу с дополнительным столбцом.

Это хороший способ добиться того, чего я пытаюсь достичьделать?

Ответы [ 4 ]

3 голосов
/ 15 сентября 2010

1:) Иерархические данные не должны отображаться в <table>, вместо этого используйте вложенные <ul> или <ol>.Таблицы для табличных данных.

2:) Поскольку c # является объектно-ориентированным языком, я не буду ссылаться на объекты в дереве по Id.Почему бы не добавить коллекцию дочерних объектов в качестве члена, образец кода будет выглядеть следующим образом:

class TreeElement 
{
 public TreeElement Parent {get;}
 public IEnumerable<TreeElement> Children{get;};
 public AddChild(TreeElement element }
 public bool IsRoot { return Parent == null; }
 public bool IsLeaf { return Children.Length == 0; }
 public bool IsBranch {return !IsRoot && !IsLeaf; }
}

обычно в дереве вы не хотите выполнять родительский поиск.Поэтому, если не нужно, оставьте все родительские ссылки, чтобы избежать бесполезной сложности;) Попробуйте вставить материал в базу данных в структуру объекта, как указано выше.

3:) Поиск ключа в соответствии с вашей модельюбудет идти очень медленно в SQL.Вам нужно будет циклически преобразовать данные и использовать операторы if / else в своем запросе. На SQLTeam отличный пример того, как сделать это очень быстро с использованием дополнительного столбца lineage.

4:) Используйте linq для запроса и получения результатов для ваших данных.

1 голос
/ 15 сентября 2010

Если вы можете использовать Jquery в своем приложении, тогда рассмотрите возможность использования следующего плагина Jquery, который обладает множеством функций.как jQuery - на условиях лицензии MIT или GNU General Public License (GPL) версии 2) - как указано на веб-сайте jstree

0 голосов
/ 15 сентября 2010

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

  • стол ученический
  • Настольные учителя
  • Классы стола
  • таблица SubjectTypes (type_id, описание) английский, математика, спорт и т. Д ...
  • Таблица Subjects (class_id, teacher_id, subject_type_id)
  • таблица StudentDistribution (stu_id, subject_id)
  • таблица очков (stu_id, subject_id, оценка)
0 голосов
/ 15 сентября 2010

Я бы предложил иметь следующие таблицы:

Person
 - Person_ID (PK)
 - Type (student/teacher etc)
 - Name etc...

PersonGroups
 - PersonGroup_ID (PK)
 - Description etc..

Subjects
 - Subject_ID (PK)
 - Description etc...

Classes
 - Class_ID (PK)
 - Subject_ID (FK)
 - Description etc...

PersonClassMembership
 - Person_ID (FK)
 - PersonGroup_ID (FK)
 - Class_ID (FK)

PersonGroupMembership
 - PersonGroup_ID (FK)
 - Person_ID (FK)

С этим достаточно гибко, чтобы добавить больше членов, таких как новые учителя или студенты, в класс / группу.

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

...