Мне нужно хранить и извлекать элементы плана курса в последовательности. Мне также нужно иметь возможность добавлять или удалять элементы в любой момент.
Данные выглядят так:
-- chapter 1
--- section 1
----- lesson a
----- lesson b
----- drill b
...
Я должен быть в состоянии определить последовательность так, чтобы, когда студент заканчивает lesson a
Я знаю, что ему нужно переехать в lesson b
, Мне также нужно иметь возможность вставлять элементы в последовательности, как, скажем, drill a
и, конечно, теперь студент идет из lesson a
в drill a
вместо того, чтобы идти в lesson b
,
Я понимаю, что реляционные базы данных не предназначены для последовательностей. Первоначально я думал об использовании простого столбца автоинкремента и использовал его для обработки последовательности, но требование вставки делает его неосуществимым.
я видел этот вопрос и первый ответ интересен:
items table
item_id | item
1 | section 1
2 | lesson a
3 | lesson b
4 | drill a
sequence table
item_id | sequence
1 | 1
2 | 2
3 | 4
4 | 3
Таким образом, я буду продолжать добавлять элементы в items table
с любым идентификатором и выработать последовательность в sequence table
, Единственная проблема с этой системой заключается в том, что мне нужно изменить порядковые номера для всех элементов в таблице последовательностей после вставки. Например, если я хочу вставить quiz a
до drill a
Мне нужно обновить порядковые номера.
Ничего страшного, но решения кажутся немного сложными. Есть ли более простой и умный способ справиться с этим?
Просто свяжите записи с родителем и используйте флаг последовательности. Вам все еще нужно будет обновить все записи, когда вы вставите их посередине, но я не могу придумать простой способ обойти это, не оставляя себе места для начала.
items table:
id | name | parent_id | sequence
--------------------------------------
1 | chapter 1 | null | 1
2 | section 1 | 1 | 2
3 | lesson a | 2 | 3
4 | lesson b | 2 | 5
5 | drill a | 2 | 4
Когда вам нужно вставить запись посередине, такой запрос будет работать:
UPDATE items SET sequence=sequence+1 WHERE sequence > 3;
insert into items (name, parent_id, sequence) values('quiz a', 2, 4);
Чтобы выбрать данные по порядку, ваш запрос будет выглядеть так:
select * from items order by sequence;
Других решений пока нет …