2008-12-04 38 views
0

我有一个有趣的问题:视觉订购大数据集

我正在建立一个基于web的图像库程序,即将包括近7,000图像。

所以,这是我的问题:什么是构建订购系统的最佳方式?

例如,如果管理员想让4,984张图片落在3,223的位置(我和一些我刚才知道会想要做的肛门人一起工作:)。

由于这是一个基于Web的系统,我不希望每次重新定位条目时都必须更新所有7,000 db条目,但这是我可以想到的最准确的方法。

那么,有没有人有更好的方法?

回答

1

我会建议类似安德烈的解决方案。添加一个类型为longint的orderby列,并使用1000的倍数值(1,1000,2000,3000等)对该列进行初始化。然后,当您需要更改单个图像的顺序时,可以将该图像按列顺序排列(按照行之前的顺序排序)/ 2。

的pseudosqlcode会是这样的:

moveImageTo(int imageIdToMove, int imageIdMoveTo) 
{  
    int orderIdMoveTo = (select orderby from images where id = imageIdMoveTo); 
    update images set orderby = (orderIdMoveTo + 
     (select top 1 orderby from images where orderby > orderIdMoveTo order by orderby) 
     )/2 where id = imageIdToMove; 
} 

另外,作为安德烈指出你将定期必须通过所有图像运行并重新初始化排序依据列。我会给做一个存储过程,pseudosqlcode会是这样的:

alter table images create temp_orderbycolumn int null; 
create updatecursor that initializes temp_orderbycolumn with 1,1000,2000 etc (this cursor must run in the order of the orderby column) 
update images set orderby = temp_orderbycolumn; 
alter table images drop temp_orderbycolumn; 

PS:我很喜欢你一起工作的人的描述:d

1

所有图像可以互换吗? (他们是相同的大小?) 最简单的我能想到的是,为每个图像存储元数据,ID,X位置,Y位置,也许索引(在你的例子中3,223)。重新定位图像后,更改图像数据库记录中的相关字段。或者也许我错过了一些东西。

0

您在数据库中订购了一套几种方法:

  1. 添加的行号的每一行, 这需要你当一个移动更新 所有条目。

  2. 添加一个AfterRowId每一行 - 在这种情况下,你将有更新 那是移动一个 再一个,这将是以后它之后的行。

据我所知,第一种方式是你不想做的事情。如果数据库不支持递归表达式(CTE或其他),则第二种方法更难以选择。

还有另一种解决方案,但它更具风险 - 您可以将行号设置为双/十进制值,并且在第2行和第3行之间移动行时,将其行号设置为2.5。达到精度限制后,这将失败,因此您必须定期重新编号数据库或检测精度损失。

0

添加元数据描述图片以不同的方式。使元数据可扩展,以便添加呈现图像的新方法。 例如,您可以为不同的目的添加不同的orderId。或权重系数来确定图像在列表中是高还是低。