我们想在 SQL Server 2012 中存储一个简单的 Web 导航菜单。这将为多个客户端完成,这就是我们需要存储它的原因。菜单项也需要有顺序,因此可以按照客户的需要对其进行排序。我一直在阅读 SQL Server 的 HierarchyId 数据类型,但我发现的几乎所有教程都使用员工或公司层次结构的示例,顶部有一个根节点。经过数小时的阅读和测试,我对HierarchyId 可能不是简单的链接导航菜单的最佳工具感到震惊。我有这种感觉吗?
我注意到 HierarchyId 让我担心的主要一点是,你只能有一个带有 HierarchyId 的根节点。但是有了导航菜单,显然有多个可以有子级的顶级“根节点”。而且由于根节点没有顺序(它们只是“/”),我们的客户将无法在其顶级菜单链接中移动。
因此,显而易见的选择是拥有一个虚拟根节点,并将所有顶级菜单链接都放在该根节点下。但是根据这个 SO question,marc_s 和 Jeremy 似乎不寻常(或者不是根据 HierarchyId 的正常用法)创建一个人造的“über-root”节点,只是为了拥有多个一级节点。并且通过执行这个“über-root”节点,我是不是也抛弃了 SQL 服务器的 GetLevel() 函数,因为“顶级”节点现在将显示为级别 1 而不是 0?
我正在考虑只在每一行中存储一个 ParentId 并在 C# 中使用递归来构建菜单层次结构。我这样做会错吗?HierarchyId 数据类型是否真的适用于这种情况,而我只是遗漏了一些东西?