2012-01-27 4 views
1

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

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; 

ответ

1

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

Read под «ROWID'ы и Целочисленное Первичный ключ» @http://www.sqlite.org/lang_createtable.html

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

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

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

+1

Я вижу, что rowid автоматически активирует «первичный ключ», если первичный ключ не указан. Я удалил PRIMARY KEY и order_id из таблицы и сделал select * из таблицы order by rowid и получил то, что я хотел! Благодарю. – Mark

2

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

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

+0

Является ли причина, по которой вы не рекомендуете ее из-за верхних границ int? – Ilion

+1

Нет. Если вы хотите отслеживать дату ввода, вы должны использовать соответствующее поле даты. Моделируйте это явно после того, что вы отслеживаете OrderID, должен быть просто уникальным идентификатором, а не двухсторонним способом получения хронологии заказов. – JohnFx

0

Вы можете полностью удалить индекс 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 будет означать дополнительный индекс, который здесь просто накладные.

Смежные вопросы