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

ВЫБРАТЬ * ИЗ элементов ГДЕ user_id = "$ user_id";

Но если есть тысячи элементов, поиск по таблице займет вечность, верно?

Есть ли лучший способ сделать это? Может быть, способ сохранить все номера элементов, связанных с пользователем, в поле в таблице пользователей?

Спасибо, Джейсон

1
lewicki 26 Май 2011 в 00:06
У каждого элемента есть ровно один пользователь?
 – 
PeeHaa
26 Май 2011 в 00:09

3 ответа

Лучший ответ

Нет, это не займет вечность. Так и надо, даже если бы записей были миллионы.

Я заметил, что вы указали значение user_id ... Разве это не числовое поле? Цитаты не нужны.

Очевидно, что user_id должен быть индексированным полем.

1
Fosco 26 Май 2011 в 00:08
Это часть строки php: $ query = "SELECT * FROM items WHERE user_id = '$ user_id'"; Это работало бы без кавычек?
 – 
lewicki
26 Май 2011 в 00:13
Ага ... $query = "select * from items where user_id = $user_id"; и убедитесь, что вы дезинфицируете эту переменную, чтобы она не могла быть sql-инъекцией.
 – 
Fosco
26 Май 2011 в 00:14

Базы данных (не только MySQL) довольно быстрые при поиске. Таким образом, даже в миллионах записей потребуется всего несколько миллисекунд, чтобы найти такую ​​строку. Базы данных используют для этого «индексы» - поэтому, если столбец «user_id» не является первичным ключом, создайте индекс для user_id. В противном случае это могло быть медленным.

1
Lukas 26 Май 2011 в 00:12

Сохраните текущую структуру, но добавьте индекс на user_id. Это будет означать, что нет необходимости искать «тысячи элементов» при поиске в этом столбце.

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

3
Martin Smith 26 Май 2011 в 00:09