MySql db结构按顺序存储项目列表

时间:2014-12-14 07:55:48

标签: php mysql normalization sequences

我需要按顺序存储和检索课程计划的项目。我还需要能够随时添加或删除项目。

数据如下所示:

-- chapter 1
 --- section 1
 ----- lesson a
 ----- lesson b
 ----- drill b
 ...

我需要能够识别序列,以便在学生完成lesson a时,我知道他需要转到lesson b。我还需要能够在序列中插入项目,比如说drill a,当然现在学生从lesson a转到drill a而不是转到lesson b

我理解关系数据库不适用于序列。最初,我想过使用一个简单的自动增量柱并使用它来处理序列,但插入要求使它无法工作。

我见过this question,第一个答案很有趣:

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中添加任何id的项目,并在sequence table中计算出序列。该系统唯一的问题是我需要在插入后更改序列表中所有项目的序列号。例如,如果我想在quiz a之前插入drill a,我需要更新序列号。

不是很大,但解决方案似乎有点过于复杂。是否有更简单,更智能的方法来处理这个问题?

1 个答案:

答案 0 :(得分:1)

只需将记录与父级相关联并使用序列标志即可。当您插入中间时,您仍然需要更新所有记录,但我不能真正想到一个简单的方法而不留下自己的空间开始。

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;