我有一个asp.net-mvc网站,并且有一个html数据表,其中一列是排名,它表示该行的优先级(每行代表一个请求)。我允许人们用新数字编辑一行中的数据,但实际上并不会影响其他任何一行(例如,没有什么阻止人们输入另一行中存在贪婪的值)
我正在寻找具有更有效的前端和快速后端的解决方案。我将分解每个:
前端:
我需要一些功能,可以在其中上下拖动行或单击上/下箭头,或者当我在一行中输入排名值时,它会更新所有其他行的排名。我基本上不希望用户必须更新每行,如果有排名第一的新条目(基本上必须更新先前的1 => 2,先前的2 => 3和先前的3 => 4等) 。
是否有任何jquery库或有用的模式可以帮助支持该功能(避免不得不从头开始进行连接),因为这似乎是我可以想象很多其他人使用的通用功能。
作为参考,如果任何人都熟悉JIRA Greenhopper Planning board,这将是理想的模仿示例。
后端
我的相关问题是,当我更新后端时,我试图弄清楚如何避免这种操作非常缓慢。如果我的数据库表中有一个rank字段,并且有人将某项更新为第一,那么我基本上必须在其他每一行上运行一个更新查询,以将值更改为现有值+1。是否有某种模式可以做到这一点更有效?
最佳答案
对于前端,请查看jQueryUI's Sortable功能。它通常应用于<ul/>
或<ol/>
元素,但是如果需要,可以快速进行Google搜索turns up guides使其也适应<table/>
元素。
一个插入到多个更新中的后端问题可以通过将其视为链接列表来解决。
我假设您将数据存储为:
Rank | Key
1 | Zebra
2 | Pig
3 | Pony
因此,插入新行可能需要潜在地更新每个现有行:
Rank | Key
1 | Penguin * Inserted
2 | Zebra * Updated
3 | Pig * Updated
4 | Pony * Updated
而是通过将它们与表中的另一行相关联来存储它们的顺序。
Key | ComesAfter
Zebra | null
Pig | Zebra
Pony | Pig
因此,插入新行最多需要更新一次。
Key | ComesAfter
Penguin | null * Inserted
Zebra | Penguin * Updated
Pig | Zebra * Unchanged
Pony | Pig * Unchanged
当然,您可以为此使用ID
然而
您可能过早地进行了优化;即使发布许多更新,一些简单的SQL工作也可能被证明是非常有效的。考虑一下:
Key | Rank
Zebra | 3
Pig | 1
Pony | 2
请注意,Value在此处充当自然键,它也可以具有ID(与
Rank
不同)。要将新行添加为等级1,您需要执行以下操作:
begin tran
insert values ('Penguin', 1)
update table set Rank = Rank + 1 where Rank >= 1
commit
添加索引和可能的分区(取决于表的大小)将极大地提高性能-唯一的权衡是偶尔进行数据库管理。
这里的主要问题是您要求哪个方面:快速读取,快速写入或简单设计?您可以拥有三个中的两个:)