我目前正在创建一个 sqlite 数据库,我需要在其中定义一个排名系统。 每个级别必须在层次结构中具有唯一的位置。 我想到的第一个方法是创建一个
position
属性来指示排名位置,如下所示:
CREATE TABLE IF NOT EXISTS ranks (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
position INTEGER NOT NULL UNIQUE,
)
问题是,如果我想在列表中间插入一个成绩,我必须重新定义其上方所有成绩的
position
。
经过一番研究,我遇到了其他解决方案,它们创建了
parent_id
属性,它是引用 id
的外键,并且似乎使用“递归查询”检索数据,但我不知道这种方法是否有效在这种情况下很好。
你知道最好的方法吗?
浮动位置:
CREATE TABLE IF NOT EXISTS ranks_real (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
position REAL
);
DELETE FROM ranks_real;
INSERT INTO ranks_real (name, position) values ('ONE', 1);
INSERT INTO ranks_real (name, position) values ('TWO', 2);
INSERT INTO ranks_real (name, position) values ('BETWEEN ONE AND TOO', (1+2)/2.0);
SELECT * FROM ranks_real ORDER BY position;
位置/换位
CREATE TABLE IF NOT EXISTS ranks_two_indexes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
position INTEGER,
sub_position INTEGER
);
DELETE FROM ranks_two_indexes;
INSERT INTO ranks_two_indexes (name, position, sub_position) values ('ONE', 1, 0);
INSERT INTO ranks_two_indexes (name, position, sub_position) values ('TWO', 2, 0);
INSERT INTO ranks_two_indexes (name, position, sub_position) values ('BETWEEN ONE AND TOO', 1, 1);
SELECT * FROM ranks_two_indexes ORDER BY position, sub_position;