2012-02-23 6 views
0

У меня есть следующая проблема: я загружаю «dif» -table только с удалением и вставками. «Изменение» определяется удалением, за которым следует вставка.Порядок строк в таблице

В этой таблице нет первичного ключа и нет поля для заказа. Я хочу использовать Hibernate для загрузки этой таблицы. (SELECT obj FROM MyDifTable obj WHERE obj.group = groupId)

Прямо сейчас, я использую ключ по всем значениям и указанному выше запросу, и я не получаю строки в том же порядке, что и в исходной таблице.

Мои вопросы:

  1. Как я позволяю Hibernate всегда возвращает тот же порядок, что и в таблице?
  2. Как указать первичный ключ в этом случае?

Я знаю, что это такая плохо спроектированная вещь, и я пытался аргументировать конструкторскую команду, но безуспешно.

С наилучшими пожеланиями, Кай

+2

Имейте в виду, что в целом «SELECT» без «ORDER BY» не дает никаких гарантий относительно порядка, в котором строки возвращаются. Имея это в виду, запрос * «того же порядка, что и в таблице» * является сомнительным. – NPE

+1

Как уже указывал AIX: строки в (реляционной) таблице do ** не имеют никакого порядка **. Единственный способ обеспечить последовательный заказ - использовать 'ORDER BY' –

+1

Учитывать предыдущие комментарии. Обычно ваш конкретный движок базы данных будет иметь какое-то свойство «row_id», которое вы могли бы использовать, чтобы дать вам некоторую сортировку. Но предыдущие комментарии старые правда. Синтаксис зависит от двигателя. – pcalcao

ответ

3

реляционные базы данных основаны на ветви теории множеств. Информация находится либо в базе данных (в наборе), либо отсутствует. Заказ - это не понятие в наборах, только наличие - это понятие в наборах. Это означает, что вы должны явно моделировать порядок, если вам это нужно.

Если заказ необходимо сохранить, вы должны добавить предложение «заказать», чтобы отсортировать получаемые элементы набора. Иногда этот вид является внешним (так что вы можете отложить решение заказа до момента запроса запроса). В очень редких случаях важно, чтобы этот порядок использовался в «наборе данных».

В нечетном случае вам требуется внутреннее упорядочение, вы должны сделать это, сохранив заказ вместе с данными в наборе; но для обеспечения наличия предложения «порядок по» (авторы запросов могут его опустить), вам также может потребоваться несколько хранимых процедур/представлений данных, чтобы гарантировать, что запрос всегда возвращается с правильным порядком.

Примеры внутреннего упорядочения являются общими при хранении списка в базе данных. Обычно обычно сохраняется элемент списка вместе с его индексом в списке в той же строке. Таким образом, когда он будет восстановлен, вы можете восстановить предметы и заказа.

+0

Да, это именно то, что я сказал дизайнеру :), но поскольку я очень молод, я не был на 100% уверен. Но использование rowId от Oracle решает проблему. – KaiThomasWerther

+1

Будьте осторожны с rowid, так как это деталь реализации конкретной базы данных. Если вам нужно портировать новую базу данных (в конце концов это произойдет), вам придется найти другую базу данных, которая реализует аналогичную функциональность и, возможно, переписывает ваш код для работы с другой базой данных. С другой стороны, если вы моделируете в заказе без использования функции rowid (или любой конкретной базы данных), то решение будет работать в любой реляционной базе данных, потому что вы не зависите от конкретных функций базы данных. –