【问题标题】:Best way to represent multi-hierarchy menu in SQL with "unlimited" children?用“无限”子级表示 SQL 中多层次菜单的最佳方法?
【发布时间】:2019-05-18 12:46:21
【问题描述】:

我正在尝试创建一个多层菜单,对它的分支范围没有限制 - 例如食物->水果->圆形->颜色等...

我不知道如何在 SQL 中表示关系,也不知道如何查询数据。

我想过做:

主菜单: ID:ChildID:Name:URL:PermissionID:etc.

子菜单: PID:ChildID:Name:URL:PermissionID:etc.

我认为如果子菜单有额外的子菜单,它的子菜单将是 SubMenu 表中的另一个项目,这应该有效吗? PermissionID 用于确定用户组是否可以访问菜单项。

我不确定 SQL 查询,因为我对它有点陌生。我知道最后我将 UserGroup 的 PermissionID 提供给 SQL 以从表中获取所有菜单和子菜单。

【问题讨论】:

    标签: java mysql sql database


    【解决方案1】:

    在 RDBMS 中存储分层数据不是一个好主意。您可以使用基于文档的框架,例如 Elastic https://www.elastic.co/,它以 JSON 文档格式存储数据,或者您可以在 RDBMS 的 varchar 列中使用分层 JSON。

    【讨论】:

    • 你能举一个 varchar 列中 JSON 的例子吗?有一个长的 json 不是很难跟踪吗?如果我对特定菜单进行任何更改,我需要更改 varchar 列中的许多 JSON?
    • @shaselai 肯定你必须维护 JSON,它可以让你轻松地将层次结构扩展到任何级别,但它不应该超过 varchar 限制。在 Java 中使用 gsonjackson 可以轻松地从 JSON 转换为 Object 或反之亦然。如果您在浏览器上显示菜单 JSON 将很容易通过。您可以存储{"food":"fruit","name":"orange","shape":"round","colur":"orange"} 之类的数据。在 RDBMS 中维护这种树型层次结构将难以维护,并且会增加 JOIN 成本并因此降低性能。
    • 嗯,但如果权限发挥作用,它不会让这真的很模糊吗?
    • 嗯,但如果权限发挥作用,它不会让这变得非常模糊吗?例如:Menu->food(1.Fruit,2.Veg,3.Meat)->Fruit->Oranges,Apples,Pears etc. 现在如果只有某些用户可以看到 Fruit->oranges vs Fruit->apples,pears .我将如何用 JSON 表示它?可以有很多组合。我的最终目标是让具有不同权限的人可以使用菜单项和子菜单项,这样即使在同一个菜单下,可以看到的项目也不同。我看不出使用 JSON 有什么帮助?
    猜你喜欢
    • 2020-01-21
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2014-07-25
    相关资源
    最近更新 更多