我正在为用作更大系统基础的组层次结构进行数据库设计。每个组可以包含其他组,也可以包含“设备”作为叶对象(设备下方没有任何内容)。
正在使用的数据库是 MS SQL 2005。(虽然在 MS SQL 2000 中工作将是一个好处;不幸的是,需要 MS SQL 2008 的解决方案目前不可行)。
有不同类型的组,这些组需要是动态的,并且用户可以在运行时定义。例如,组类型可能是“客户”、“帐户”、“城市”或“建筑物”、“楼层”,并且每种类型将具有一组不同的属性,可由用户定义。还将应用业务规则-例如,“楼层”只能包含在“建筑物”组下,并且再次,这些可以在运行时定义。
许多应用程序功能来自基于这些组运行报告,因此需要一种相对快速的方法来获取某个组(和所有子组)中包含的所有设备的列表。
使用修改的预排序树遍历技术存储组的优点是速度快,但缺点是相当复杂和脆弱 - 如果外部用户/应用程序修改数据库,则有可能完全损坏。我们还实现了一个 ORM 层,这种方法似乎在大多数 ORM 库中使用关系变得复杂。
使用公用表表达式和“标准”id/parentid 组关系似乎是避免运行多个递归查询的有效方法。这种方法有什么缺点吗?
至于属性,存储它们的最佳方式是什么?一张又长又窄的桌子,与小组有关?是否应该将通用属性(例如“名称”)存储在组表中,而不是属性表中(很多时候,名称将是显示所需的全部内容)?
使用这种方法是否会出现性能问题(假设在合理的硬件上(例如四核 Xeon 2 Ghz、4GB ram)上平均有 2000 个组,每个组平均有 6 个属性,平均有 10 个并发用户,折扣任何其他过程)?
随意提出与我在这里概述的完全不同的架构。我只是想说明我关心的问题。