The best way I've found to handle this is to have a floating point order field. When you move something between two other items, set that field to halfway between its neighbors.
This is cheap on both reads and writes. The only downside is the floats keep getting longer :)