Sql 在同一个表中链接行是一种错误的模式吗?
我想创建一个目录树结构,并需要找到一种合适的方法将其存储到数据库中。想想下面的动物树,它非常准确地描述了它应该是什么样子: 我现在的问题是,将这些条目链接到同一个表中是否是一个好主意。SQLite不允许我向同一个表中的值添加外键约束,因此我必须手动确保不会造成不一致。这就是我目前的计划:Sql 在同一个表中链接行是一种错误的模式吗?,sql,sqlite,Sql,Sqlite,我想创建一个目录树结构,并需要找到一种合适的方法将其存储到数据库中。想想下面的动物树,它非常准确地描述了它应该是什么样子: 我现在的问题是,将这些条目链接到同一个表中是否是一个好主意。SQLite不允许我向同一个表中的值添加外键约束,因此我必须手动确保不会造成不一致。这就是我目前的计划: id | parent | name ---+--------+-------- 1 | null | Animal 2 | 1 | Reptile 3 | 2 | Lizard
id | parent | name
---+--------+--------
1 | null | Animal
2 | 1 | Reptile
3 | 2 | Lizard
4 | 1 | Mammal
5 | 4 | Equine
6 | 4 | Bovine
parent
引用同一个表中的id
,一直向上,直到找到null
,它是根。这是一个坏模式吗?如果是这样,将树结构放入关系数据库的常见替代方案是什么?如果您的SQLite版本支持递归CTE,那么这是一个选项:
WITH RECURSIVE cte (n) AS (
SELECT id FROM yourTable WHERE parent IS NULL
UNION ALL
SELECT t1.id
FROM yourTable t1
INNER JOIN cte t2
ON t1.parent = t2.n AND t1.name NOT LIKE '%Lizard%'
)
SELECT *
FROM yourTable
WHERE id IN cte;
这是未经测试的,但是在上述CTE的递归部分中对
t1.name
的检查(希望如此)应该在我们到达与LIKE
表达式中的名称匹配的记录时停止递归。在搜索Lizard
的情况下,递归应该停止在Lizard之上一个级别,这意味着应该返回层次结构中它之上的所有记录。您的表是一个递归层次结构,在SQL中非常常见。当您想要查询表以得到某些问题的答案时,技巧就来了。在这里,您是否有特定的查询/要求?是的,我想使用像一样搜索特定的单词,然后查找搜索结果的所有父类别。您使用的是哪个版本的SQLite?最新版本使用的是SQLiteStudio。t2.n
,而不是t2.id
。不幸的是,它无法工作。它只返回一个空查询。谢谢你的提示,我将进一步研究这个递归函数。没关系,我忘了更改一个表名。它就像一个符咒。非常感谢。