MySql db структура для хранения списка элементов в последовательности

Мне нужно хранить и извлекать элементы плана курса в последовательности. Мне также нужно иметь возможность добавлять или удалять элементы в любой момент.

Данные выглядят так:

-- 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 Мне нужно обновить порядковые номера.

Ничего страшного, но решения кажутся немного сложными. Есть ли более простой и умный способ справиться с этим?

0

Решение

Просто свяжите записи с родителем и используйте флаг последовательности. Вам все еще нужно будет обновить все записи, когда вы вставите их посередине, но я не могу придумать простой способ обойти это, не оставляя себе места для начала.

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;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]