SQLite: заказ моих избранных результатов - PullRequest
1 голос
/ 27 января 2012

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

CREATE TABLE foo (
  username TEXT PRIMARY KEY,
  col1 TEXT,
  col2 TEXT,
  ...
  order_id INTEGER NOT NULL
);

CREATE INDEX foo_order_index ON foo(order_id);

SELECT * FROM foo where username = 'bar' ORDER BY order_id;

Ответы [ 3 ]

2 голосов
/ 27 января 2012

Добавьте поле DateAdded и установите по умолчанию его в качестве даты / времени добавления строки и сортируйте по нему.

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

1 голос
/ 27 января 2012

Если у каждого пользователя будет 1000 строк, то имя пользователя не должно быть первичным ключом. Одним из вариантов является использование столбца с идентичностью int, который есть во всех таблицах (который оптимизирует чтение операций ввода-вывода, поскольку он обычно хранится в таком порядке).

Читать в разделе «RowIds и первичный ключ целого числа» @ http://www.sqlite.org/lang_createtable.html

Данные для каждой таблицы в SQLite хранятся в виде структуры B-Tree содержащий запись для каждой строки таблицы, используя значение rowid в качестве ключ. Это означает, что получение или сортировка записей по rowid выполняется быстро.

Поскольку он хранится в таком порядке в структуре B-дерева, его следует быстро упорядочить по первичному ключу int. Убедитесь, что это псевдоним для rowid - подробнее в этой статье.

Кроме того, если вы собираетесь выполнять запросы, где username = 'bob', вам следует рассмотреть индекс для столбца username - особенно будет много пользователей, которые делают индекс эффективным из-за высокой селективности. Напротив, добавление индекса для столбца со значениями, такими как 1 и 0, приводит только к низкой селективности и делает индекс очень неэффективным. Итак, если у вас 3 пользователя :) это того не стоит.

0 голосов
/ 27 января 2012

Вы можете полностью удалить столбец order_id и индекс (если только они вам не нужны для чего-то другого, кроме этой сортировки).

Таблицы SQLite всегда имеют целочисленный первичный ключ - в этом случае ваш столбец имени пользователя молчасделал уникальный ключ, поэтому таблица имеет только один целочисленный первичный ключ.Ключевой столбец называется rowid.Для вашей сортировки вам нужно явно сделать это AUTOINCREMENT, чтобы каждая строка всегда имела более высокий идентификатор строки, чем более старые строки.

Возможно, вы захотите прочитать http://www.sqlite.org/autoinc.html

CREATE TABLE foo (
   rowid INTEGER PRIMARY KEY AUTOINCREMENT,
   username TEXT UNIQUE KEY,
   ...

Тогда ваш выбор становится

 select * from foo order by rowed;

Одним из преимуществ этого подхода является то, что вы повторно используете индекс, который SQLite уже поместит в вашу таблицу.Столбец date или order_id будет означать дополнительный индекс, который здесь только заголовок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...