Да, sqlite поддерживает это. Вы можете легко установить внешний ключ, который ссылается на ту же таблицу. Модель, которую вы описываете, называется моделью списка смежностей , и, как очень популярна.
Однако проблема с моделью списка смежности заключается в том, что рекурсивные операции очень трудно писать, если СУБД не может выполнять рекурсивные запросы.
Некоторые СУБД, такие как SQL Server 2005, Postgres 8.4 и Oracle 11g 1 , поддерживают рекурсивные запросы с общими табличными выражениями с использованием ключевого слова WITH
). Эта функция позволяет легко писать рекурсивные запросы, но sqlite и MySQL пока не поддерживают рекурсивные запросы.
Вас может заинтересовать следующая статья, в которой описывается альтернативная модель (модель вложенного набора ), которая значительно упрощает рекурсивные операции, даже если Модель вложенного множества определенно сложнее, чем список смежности :
Кроме того, я также предлагаю ознакомиться со следующей презентацией и сообщениями @ Билла Карвина , постоянного участника переполнения стека 2 :
Модель таблицы закрытия *1053*, описанная в этих ссылках, является очень допустимой альтернативой модели вложенного набора . Далее Билл описывает эту модель в своей книге SQL Antipatterns ( отрывок из главы по этой теме [PDF]).
В противном случае вы также можете придерживаться простой модели списка смежностей , а затем выполнять рекурсивную часть в вашем приложении, загружая все данные, создавая дерево и просматривая его.
1 Oracle также может выполнять рекурсивные запросы, используя CONNECT BY
, что поддерживается начиная с версии 2.
2 Вы также можете проверить следующую публикацию переполнения стека: Производительность рекурсивной обработки данных с использованием Java и SQLite , обсуждение этой темы.