首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分层存储和查询

分层存储和查询
EN

Database Administration用户
提问于 2016-09-24 02:23:33
回答 1查看 94关注 0票数 3

我正在编辑和提供这个问题的新信息,因为我已经找到了我需要的,只是有几个关于效率的问题。

现在,我有张桌子:

代码语言:javascript
复制
category
--------------------------
category_id   name         parent
1           Phillips       (null)
2           Barnes          1
3           Moore           2
4           de Mohrenschildt   3
5           Oswald          9
6           Hunt            2
7           Burnham         6
8           Buckley         7
9           Paine           4
10          Sturgis         6
11          Hunt            3

我有一个疑问:

代码语言:javascript
复制
SELECT
  t1.name AS lev1,
  t2.name AS lev2,
  t3.name AS lev3,
  t4.name AS lev4,
  t5.name AS lev5,
  t6.name AS lev6
FROM category t1
  LEFT JOIN category t2
    ON t2.parent = t1.category_id
  LEFT JOIN category t3
    ON t3.parent = t2.category_id
  LEFT JOIN category t4
    ON t4.parent = t3.category_id
  LEFT JOIN category t5
    ON t5.parent = t4.category_id
  LEFT JOIN category t6
    ON t6.parent = t5.category_id
WHERE t1.name = 'Phillips'
ORDER BY lev2

返回:

代码语言:javascript
复制
lev1        lev2    lev3    lev4         lev5      lev6
Phillips    Barnes  Hunt    Sturgis      (null)    (null)
Phillips    Barnes  Moore   de Mohr'ldt  Paine     Oswald
Phillips    Barnes  Hunt    Burnham      Buckley   (null)

对于一个新的“节点”:

代码语言:javascript
复制
SELECT
  t1.name AS lev1,
  t2.name AS lev2,
  t3.name AS lev3,
  t4.name AS lev4,
  t5.name AS lev5,
  t6.name AS lev6
FROM category t1
  LEFT JOIN category t2
    ON t2.parent = t1.category_id
  LEFT JOIN category t3
    ON t3.parent = t2.category_id
  LEFT JOIN category t4
    ON t4.parent = t3.category_id
  LEFT JOIN category t5
    ON t5.parent = t4.category_id
  LEFT JOIN category t6
    ON t6.parent = t5.category_id
WHERE t1.name = 'Moore'
ORDER BY lev2;

回传

代码语言:javascript
复制
lev1    lev2        lev3    lev4    lev5    lev6
Moore   Hunt        (null)  (null)  (null)  (null)
Moore   de Mohr'dt  Paine   Oswald  (null)  (null)

正如您所看到的,在形式上,它非常接近于此,包括一些html:

  • 菲利普斯监督:
    • 被监管的巴恩斯:
      • 摩尔监督
        • 德莫伦塞特知道:
          • 奥斯瓦尔德。

代码语言:javascript
复制
    - Sturgis _knew_ 
        - Hunt _knew_ 
            - Moore _worked for_...

希望有一天能成熟(图片中标签下面的内容).:

关于这个表和查询,我有几个问题。

1)从"Hunt“这个名字中可以看出,我可能遇到的问题是,当一个人被分配给不止一个父母时,我将不得不为他输入一个新的记录。就像将要出现的那样,我猜有5到600个独特的人,重复一遍,对我来说,很多人似乎是没有必要的。有人能找到更好的方法来处理这个问题,或者甚至是一个问题吗?我只是不喜欢裁员..。

2)沿着这些思路,如果您查看该图像,您将看到其中一些名称是红色的,表示有关该直接关系的相关信息的AJAX下拉段。因此,“亨特”可能在这个特定的分支下有一两个段落,而在其他地方的另一个分支上可能有一个段落。我在想,如果需要在表中的任何地方重复"Hunt“,可能会允许调用另一组数据来填充AJAX下拉列表。到目前为止我在这里是在自找麻烦吗?

3)由于将有那么多以不同名称开头的分支,如果必须在一个页面(许多)上运行查询40或50次,特别是在调用上面提到的一些额外数据时,这个查询是否足够有效?

我喜欢这个“模式”,如果这是正确的话,因为它看起来确实是可扩展的。这个数据库有无限增长的潜力。

我真的很感激任何人在这方面的帮助。我很高兴我终于找到了对我有用的东西(直到昨晚我才知道分层DB是什么,这就是我要找的.)

EN

回答 1

Database Administration用户

发布于 2016-09-28 00:28:39

由于深度是可变的,而且一个项目可以有多个父级,所以我推荐一般的“关系”,而不是父-子层次结构。

有关编写多到多表的最佳方法,请参见

然后您需要编写多个查询,而不是一个固定深度的查询。没有一种“好的”方法可以遍历树/DAG/web(直到8.0,使用CTE)。而且,具有适当索引和适当缓存的多个查询的速度应该是足够的。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/150555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档