Этот вопрос относится к базовым данным, но, если я не ошибаюсь, он в равной степени относится и к более общему случаю SQL.
Я хочу вести упорядоченную таблицу с использованием базовых данных свозможность для пользователя:
- изменить порядок строк
- вставить новые строки в любом месте
- удалить любую существующую строку
Какие данные лучшемодель для этого?Я вижу два способа:
1) Моделировать его как массив: я добавляю свойство int position
к своей сущности
2) Моделировать его как связанный список: я добавляю дваотношения «один к одному», next
и previous
от моей сущности к себе
1) упрощают сортировку, но болезненно вставлять или удалять, так как вам нужно обновить position
всехобъекты, которые идут после
2), позволяют легко вставлять или удалять, но очень трудно сортировать.На самом деле, я не думаю, что знаю, как выразить дескриптор сортировки (предложение SQL ORDER BY
) для этого случая.
Теперь я могу представить вариант 1):
3) добавить свойство int ordering
к сущности, но вместо того, чтобы считать его по одному, пусть оно будет считать 100 на 100 (например).Тогда вставка так же проста, как и поиск любого числа между порядком предыдущего и следующего существующих объектов.Дорогое перенумерация должна происходить только после заполнения 100 лунок.Если сделать это свойство float, а не int, это сделает его еще лучше: почти всегда можно найти новый float на полпути между двумя поплавками.
Я на правильном пути с решением 3), или есть что-то умнее