相关疑难解决方法(0)

在关系数据库中存储分层数据有哪些选项?

好的概述

一般来说,您要在快速读取时间(例如,嵌套集)或快速写入时间(邻接列表)之间做出决定.通常,您最终会得到最适合您需求的以下选项组合.以下提供了一些深入阅读:

选项

我知道和一般的功能:

  1. 邻接清单:
    • 列:ID,ParentID
    • 易于实施.
    • 便宜节点移动,插入和删除.
    • 昂贵的找到水平,血统和后代,路径
    • 在支持它们的数据库中通过公用表表达式避免使用N + 1
  2. 嵌套集(又名修改的预订树遍历)
    • 列:左,右
    • 便宜的血统,后代
    • 非常昂贵的O(n/2)移动,插入,由于易失性编码而删除
  3. 桥表(又名闭包表/ w触发器)
    • 使用单独的连接表:祖先,后代,深度(可选)
    • 廉价的血统和后代
    • 写入O(log n)插入,更新,删除的成本(子树的大小)
    • 规范化编码:适用于连接中的RDBMS统计信息和查询规划器
    • 每个节点需要多行
  4. 谱系列(又名物化路径,路径枚举)
    • 专栏:血统(例如/父母/孩子/孙子/等......)
    • 廉价后代通过前缀查询(例如LEFT(lineage, #) = '/enumerated/path')
    • 写入O(log n)插入,更新,删除的成本(子树的大小)
    • 非关系型:依赖于Array数据类型或序列化字符串格式
  5. 嵌套间隔
    • 像嵌套集一样,但是使用实数/浮点数/小数,这样编码就不易变(廉价的移动/插入/删除)
    • 有实/浮/十进制表示/精度问题
    • 矩阵编码变体为"自由"添加了祖先编码(物化路径),但增加了线性代数的诡计.
  6. 平表
    • 修改的Adjacency List,为每条记录添加Level和Rank(例如排序)列.
    • 便宜迭代/分页
    • 昂贵的移动和删除
    • 好用:线程讨论 - 论坛/博客评论
  7. 多个谱系列
    • 列:每个谱系级别一个,指向根目录的所有父级,从项目级别向下的级别设置为NULL
    • 便宜的祖先,后代,水平
    • 便宜的插入,删除,移动的叶子 …

sql database tree relational-database hierarchical-data

1281
推荐指数
7
解决办法
23万
查看次数

如何将MSSQL CTE查询转换为MySQL?

在我的MySQL模式中,我有category(id, parentid, name)

在MSSQL中,我有CTE查询(从下到上为所提供的类别ID构建一个类别树:

with CTE (id, pid, name) 
as
(
    select id, parentid as pid,name
    from category
    where id = 197
      union all
        select CTE.pid as id , category.parentid as pid, category.name
        from CTE 
          inner join category 
            on category.id = CTE.pid
 )
 select * from CTE 
Run Code Online (Sandbox Code Playgroud)

如何将该查询"转换"为MySQL?

mysql sql-server common-table-expression adjacency-list

27
推荐指数
1
解决办法
2万
查看次数

在MySQL存储过程中创建临时表

当我使用CALL语句调用它时,以下过程给出了一个错误:


CREATE DEFINER=`user`@`localhost` PROCEDURE `emp_performance`(id VARCHAR(10))
BEGIN
DROP TEMPORARY TABLE IF EXISTS performance;
CREATE TEMPORARY TABLE performance AS  
    SELECT time_in, time_out, day FROM attendance WHERE employee_id = id;
END
Run Code Online (Sandbox Code Playgroud)

错误显示"未知表'性能'".

这是我第一次真正使用存储过程,我从谷歌获取了我的资源.我只是想弄清楚我做错了什么.

mysql sql stored-procedures

26
推荐指数
2
解决办法
8万
查看次数

邻接列表模型与MySQL分层数据的嵌套集模型?

在MySQL中使用层次结构数据两种方法:

  1. 邻接表模型
  2. 嵌套集模型

邻接列表模型的一个主要问题是我们需要为每个节点运行一个查询以获取层次结构的路径.

嵌套集模型这个问题不存在,但是对于每个添加的节点有必要给一个MySQL更新所有其他值.

我的分层数据不是静态数据,例如电子商务的产品类别.是否按层次顺序注册用户.

在我的应用程序中,虽然有许多常量用户注册,但我还需要获取分层路径,直到到达层次结构中的第一个节点.

分析我的情况,两种替代方案中的哪一种最适合我的应用?

mysql adjacency-list-model nested-set-model

18
推荐指数
1
解决办法
1万
查看次数

显示每个父母的所有孩子

我有一张桌子People.我希望显示一个由每个父项组成的HTML表,其中所有子项都直接位于它们之下.

 _________
|People   |_____________________________________________
|-------------------------------------------------------|
| id     | parent | firstname     | lastname            |
|-------------------------------------------------------|
| 1        0        James           Donovan             |
| 2        0        Jeffrey         Williams            |
| 3        0        Emmit           Herring             |
| 4        2        Carol           Williams            |
| 5        2        Sarah           Williams            |
| 6        1        Nikolai         Donovan             | 
|_______________________________________________________|
Run Code Online (Sandbox Code Playgroud)

预期产量:

 ________________________________________________
|Jeffrey Williams                                |
|------------------------------------------------|
|  - Carol Williams                              |
|  - Sarah Williams                              |
|________________________________________________|
|James Donovan                                   |
|------------------------------------------------|
|  - Nikolai Donovan                             | …
Run Code Online (Sandbox Code Playgroud)

html php mysql

12
推荐指数
1
解决办法
4798
查看次数

除Oracle之外的RDBMS中的CONNECT BY或分层查询

Oracle提供了非常方便的功能.您可以使用以下子句创建分层查询(递归行为):

CONNECT BY [NOCYCLE] {condition [AND condition...]} [START WITH condition]
Run Code Online (Sandbox Code Playgroud)

如此处所述:

http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries003.htm

我想知道,有没有其他已建立的RDBMS支持等效或类似的语法?或者可以使用常规SQL一般模拟这样的递归行为?

我希望能够模拟的一个很好的例子是(取自Oracle文档):

    SELECT LPAD(' ', 2 * (LEVEL-1)) || last_name org_chart, 
           employee_id, manager_id, job_id
      FROM employees
START WITH job_id = 'AD_VP' 
CONNECT BY PRIOR employee_id = manager_id; 
Run Code Online (Sandbox Code Playgroud)

导致:

ORG_CHART          EMPLOYEE_ID MANAGER_ID JOB_ID
------------------ ----------- ---------- ----------
Kochhar                    101        100 AD_VP
  Greenberg                108        101 FI_MGR
    Faviet                 109        108 FI_ACCOUNT
    Chen                   110        108 FI_ACCOUNT
    Sciarra                111        108 FI_ACCOUNT
    Urman                  112        108 FI_ACCOUNT
    Popp                   113        108 FI_ACCOUNT
  Whalen                   200        101 AD_ASST …
Run Code Online (Sandbox Code Playgroud)

sql oracle simulation connect-by recursive-query

6
推荐指数
2
解决办法
6113
查看次数

MySQL最佳实践:尽可能选择子项递归?

我想选择一个根项目,它的子项尽可能高.我更喜欢使用嵌套集模型,但这次表结构遵循邻接模型.有关嵌套集和邻接模型的更多信息.

我有一个dependencies-table,一个items-table.

依赖表

dependency_id | item_id | child_id 
            1 |       1 |        4
            2 |       2 |        5
            3 |       4 |        7
            4 |       7 |        3
            5 |       9 |        3
            6 |       1 |        2
Run Code Online (Sandbox Code Playgroud)

物品表

item_id | name   | info
      1 | Item A | 1st Item
      2 | Item D | 2nd Item
      3 | Item C | 3rd Item
      4 | Item D | 4th Item …
Run Code Online (Sandbox Code Playgroud)

php mysql sql recursion

5
推荐指数
1
解决办法
3083
查看次数

用于选择分层注释的查询太多

我有这个 MySQL表,但它需要一个查询一个评论.如果有20条评论,则会显示20条查询以显示该页面.有什么解决方案吗?是否可以编写MySQL端函数以将查询大小减少到一个?

php mysql

3
推荐指数
1
解决办法
201
查看次数

如何用sql语句计算树的深度?

我不太明白递归查询是如何工作的以及如何解决这个问题。我们得到了左边的表,结构看起来像右边的树:

ID | Parent                        1
1     null                        / \
2     1                          2   3
3     1                               \
4     3                                4
5     4                               / \
6     4                              5   6   
7     6                                   \ 
                                           7 
Run Code Online (Sandbox Code Playgroud)

我知道如何获取每个节点的所有父节点...但我不知道如何找到树的最大深度。这意味着我必须找出这棵树有多少层。我们没有得到更多信息

如果你能给我一个 mysql 的解决方案,我将非常感激,但是任何 sql 语句都会帮助我解决这个问题

提前致谢!

mysql sql tree recursive-query

3
推荐指数
1
解决办法
2923
查看次数