【问题标题】:How do design multilevel database driven menu? [duplicate]如何设计多级数据库驱动菜单? [复制]
【发布时间】:2014-06-03 07:40:24
【问题描述】:

我想创建一个具有多个级别的数据库驱动菜单,但我不确定设计数据库表的最佳做法是什么。我做了一些搜索,但找不到太多相关信息。

最初,我想为每个级别创建一个表。例如,父级菜单将只是dbo.Menu,而直接子级菜单项位于dbo.SubMenu。话虽如此,我为dbo.Menu 设想了以下设计:

但是,当我开始填充此表时,我意识到该站点将包含一些深度为 3 的项目,并且以后有可能添加更多级别。

有设计动态菜单的最佳做法吗?我应该有一个包含所有菜单项的表,还是应该将菜单项分成多个表?

【问题讨论】:

  • 我会为每个级别创建一个表 - 使用结构来实现多重性,它不适合 RA。不管是表还是列。搜索以下术语:“父子关系”、“物化路径”、“嵌套集”和“层次 ID”,以了解如何/从何处开始。
  • FWIW(因为看起来您正在使用 SMSS/SQL Server),我目前最喜欢的方法是使用自动构建的 Hierarchy ID(“物化路径”的一种形式)邻接列表(“父子”)。
  • 太棒了。我正在使用 Hierarchy ID 数据类型创建菜单表,我很惊讶我以前从未听说过它。很酷!现在,我手动插入层次结构 ID,例如插入 CAST('/1/2/' AS HierarchyID)。我将不得不考虑从邻接列表中自动建立这种关系。谢谢!

标签: sql database-design hierarchy


【解决方案1】:

使用一个表格来容纳所有级别。您可以通过添加一个 ParentMenuId 列 (NULLABLE) 来执行此操作,该列将引用 MenuId(同一个表)。顶级菜单项的 ParentMenuId = NULL。

这种类型的实现在其他情况下可能看起来很复杂,但在这里非常理想,您每次只能访问一个子菜单。

【讨论】:

  • 也称为Adjacency List 或“父子关系”。在支持 CONNECT BY 或递归 CTE 的数据库中效果最佳;没有它,“查找所有孩子,递归”可能是一个极其退化的操作。
  • 感谢您的链接。我做这些事情已经很多年了......很多练习,但我缺乏理论方面:)
  • 有没有办法让 ParentMenuId 只允许 MenuId col 中的值?例如,外键约束是同一张表上的一列?
猜你喜欢
  • 2015-07-06
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
  • 2013-06-19
  • 2012-10-07
  • 1970-01-01
  • 1970-01-01
  • 2020-06-28
相关资源
最近更新 更多