Связанный список SQLite

#c# #sql #sqlite

#c# #sql #sqlite

Вопрос:

У меня есть структура данных связанного списка в C #, которая представляет собой своего рода цепочку. Теперь я хочу сопоставить эту цепочку с базой данных SQLite. У меня есть следующая схема:

 -- Table: MetaData
CREATE TABLE MetaData (
    Id          INTEGER PRIMARY KEY AUTOINCREMENT,
    FrameId     TEXT    NOT NULL,
    Unit        INTEGER REFERENCES Units (Id) 
                        NOT NULL,
    Predecessor INTEGER REFERENCES Units (Id),
    Name        TEXT,
    Value       TEXT
);


-- Table: Units
CREATE TABLE Units (
    Id       INTEGER PRIMARY KEY AUTOINCREMENT,
    UnitName TEXT    UNIQUE
);
 

Таким образом, каждая строка в таблице метаданных предлагает значение «Предшественник» в дополнение к значению «Единица измерения» (оба указывают на соответствующую запись в таблице «Единицы измерения»). Я подумал, что при таком подходе должно быть возможно пройти через «связанный список» (строки таблицы метаданных) до первой записи в цепочке. Теперь я ищу способ получить упорядоченный результат на основе значений «Предшественник» и «Единица измерения». Возможно ли это с помощью предложения «WITH» и рекурсии в SQL?

Я пробовал что-то подобное, но это не сработало, и я немного потерялся:

 WITH RECURSIVE list AS (
SELECT Id, 1 AS Position, Unit, Predecessor
FROM MetaData WHERE Predecessor IS NULL 
UNION ALL
SELECT m.Id, list.Position   1, m.Unit, m.Predecessor
FROM MetaData m INNER JOIN list mpl ON m.Id = mpl.Id AND m.Predecessor = mpl.Unit
)
SELECT * FROM list
 

Комментарии:

1. Опубликуйте образцы данных и ожидаемые результаты, лучше в скрипке: dbfiddle.uk/?rdbms=sqlite_3.27 чтобы уточнить, чего вы хотите.

2. В общем, такие вещи, как связанные списки и реляционные базы данных, плохо уживаются друг с другом. Рассмотрим дизайн, который сериализует ваш список в упорядоченную коллекцию, которую можно спроецировать в таблицу (и, э-э, непроецируемую, обратно в связанный список).

3. @forpas: Вы можете найти образец скрипки здесь: sqlfiddle.com /#!5/8085f/4