拥有存储在数据库中的项目的动态列表,外部流程控制此列表中的输入和输出,其发生率为每天1/2。
这些项目在此列表中保留了大约两周。
我想对我的程序做的是为此列表分配一个订单(并存储它)。
我面临的问题是如何正确地做到这一点。我应该在数据库中保存多少值?
我考虑过保存它当前的位置,但这面临的问题是,一旦项目从列表中移出(不受我控制),我必须重写其余部分的顺序,以避免不必要的空白按顺序排列。
接下来的想法是保存一个自动增加的数字,然后在项目之间交换此数字以更改顺序。然后获得真正的订单只需按该列对它们进行排序。但这会导致人数不断增加,并且感觉不对。
这样做的正确方法是什么?
编辑:进一步解释:
这是我的程序中控制它的部分(忘记红色,与此无关)。最近添加了第四项,因此没有定义订单。一旦我点击它,它应该取第四名并在数据库中保存一些值。
现在假设在任何时候都可以从这里消除第二个或第三个值,所以我不能(我可以,但我觉得我不应该)只保存1,2,3,数据库中为null。
答案 0 :(得分:1)
我过去做过类似的事情,我绝对将数字1,2,3,...存储为数据库中的“订单”列。
每当有人点击“向上”箭头将#3移动到#2时,应用程序就会运行代码,将3更改为2,将前2更改为3。
如果#2被删除,那么应用程序会运行代码,将#3移至#2,将#4移至#3,依此类推。
如果我是你,那就是我今天要做的。
答案 1 :(得分:0)
如果您的程序有一个唯一的整数,它定义了数据库中记录的顺序,那么只需将该位置存储为记录的字段。如果您有唯一约束,它会为您创建索引,因此按列排序将很快。
像这样。
CREATE TABLE [dbo].[MyTable]
(
[Id] BIGINT NOT NULL IDENTITY(1, 1), -- or some other primary key
[Position] INT NOT NULL,
-- other columns
CONSTRAINT [MyTable_Position_UIDX] UNIQUE([Position])
)
GO
然后通过有序位置访问
SELECT * FROM [dbo].[MyTable] ORDER BY [Position] DESC
编辑: 刚从另一个堆栈交换站点看到This answer,这是一个比我更正确的答案。
答案 2 :(得分:0)
这些项目在此列表中保留约两周。
(后续问题:此外部流程如何确定要从列表中删除哪些项目?)
我想用我的程序做的是为这个列表分配一个订单 (并存储它)。
(为什么? - 外部流程是否已经知道如何从列表中删除项目?是否还有其他目的通过存储列表顺序来服务?)
......不需要的空格......
(为什么这是一个问题?)
不断增加数量并且感觉不对。
(你有什么特别的担心?)
正如此处和post-datetime中的其他地方所建议的那样,自动递增的整数等都有利于排序。从你的帖子中不清楚为什么你需要这个/你想要的结果是什么,所以不确定如何更好地建议,除了"试一试!","去吧#34;等等: - )