我正在尝试开发一个页面来显示主题/老师的学生/班级成绩。
有些班级的小组包含学生,有些班级只有学生。一个主题由一个或多个教师思考。这可能会在未来发生变化,我希望尽可能保持设计的灵活性(即主题可以分解为模块或单独的测试结果,类可能按年份进一步分组等)
我希望在网格中显示最终结果,我可以展开并汇总以平均结果(Y上的类和X上的主题)。
我虽然有3个数据库表如下:
**class_structure**
id (int) PK
description (varchar)
parent_id (int) FK to id
最高级别是班级(没有父级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应用程序中,然后我查询最高级别的结构级别并平均下面的所有结果(我最好在数据库中的sproc中进行平均或在应用程序中使用说LINQ吗?)
这会给我一些最高级别的结果。
然后我需要显示这是一个表(我想在C#中创建表html?)对主题类(即首先创建所有头,然后尝试将结果放在正确的列中(我不知道怎么做但是))。
<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并获得这些结果)和然后用额外的列重绘表格。
这是实现我想要做的事情的好方法吗?
答案 0 :(得分:3)
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上a great sample关于如何使用额外的谱系列来快速实现这一点。
4:)使用linq查询并生成数据结果。
答案 1 :(得分:1)
如果您可以在应用程序中使用Jquery,那么请考虑使用以下Jquery插件,它具有很多功能..
JsTree是完全免费的(根据MIT许可证或GNU通用公共许可证(GPL)版本2的条款,与jQuery一样许可) - 如jstree网站所述。
答案 2 :(得分:0)
我建议使用下表:
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)
有了它,它足够灵活,可以为一个班级/小组增加更多会员资格,例如新老师或学生。
这绝不是最好的方式或“正确”的方式,它只是让你去思考 规范化数据库以创建可以更轻松地获得结果的查询。
答案 3 :(得分:0)
我不同意你的桌面设计。使用递归将混合数据放在一个表中确实是一个坏主意。除非您需要在DB中存储树状数据,否则不要这样做。根据你的问题,更好的设计: