SQLite可以支持这种模式吗?

4 sql sqlite schema foreign-keys

想象我有这个名为Department的表.每个部门都可以有子部门.

我想将一个名为ParentDepartmentID的列作为另一个部门的外键.如果此键为空,则表示它是父级顶级部门,而不是任何其他部门的子级.

我想你可以称之为自引用ID.SQLite支持这个吗?有外键,但也允许空值?

你会如何解决这个用例?

Dan*_*llo 6

是的,sqlite支持这一点.您可以轻松设置引用同一个表的外键.您描述的模型称为邻接列表模型,因此非常受欢迎.

但是,邻接列表模型的问题在于,除非DBMS可以执行递归查询,否则递归操作很难编写.

某些DBMS(如SQL Server 2005,Postgres 8.4和Oracle 11g 1)使用关键字支持使用公用表表达式的递归查询WITH.此功能允许轻松编写递归查询,但sqlite和MySQL不支持递归查询.

您可能有兴趣查看以下描述替代模型(嵌套集模型)的文章,这使得递归操作更容易,即使嵌套集模型肯定比邻接列表更复杂:

此外,我还建议查看以下演示文稿和@Bill Karwin的帖子,这是Stack Overflow 2的定期撰稿人:

这些链接中描述的闭包表模型嵌套集模型的非常有效的替代方法.Bill在他的SQL Antipatterns书中进一步描述了这个模型(摘自本主题的章节 [PDF]).

否则,您还可以坚持使用简单的邻接列表模型,然后在应用程序中执行递归部分,下载所有数据,构建树并遍历它.


1 Oracle也可以使用CONNECT BY从版本2开始支持的递归查询.

2您可能还想查看以下Stack Overflow帖子:使用Java和SQLite进行递归数据处理性能,讨论此主题.