4 sql sqlite schema foreign-keys
想象我有这个名为Department的表.每个部门都可以有子部门.
我想将一个名为ParentDepartmentID的列作为另一个部门的外键.如果此键为空,则表示它是父级顶级部门,而不是任何其他部门的子级.
我想你可以称之为自引用ID.SQLite支持这个吗?有外键,但也允许空值?
你会如何解决这个用例?
是的,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进行递归数据处理性能,讨论此主题.
| 归档时间: |
|
| 查看次数: |
2516 次 |
| 最近记录: |