|
Re: Вопрос по MySQL
1. Индексация - нужна для ускорения поиска. Обычно индексируют по тем полям, к которым чаще всего обращаются.
Пример:
Есть таблица Users(id: INT, FIO: VARCHAR, Phone: INT)
Если подразумевается, что пользователей чаще будут выбирать по имени, то имеет смысл проиндексировать таблицу по полю FIO, если же
чаще работают с телефоном, соотвественно, индексируют по Phone.
2. Внешний ключ. Ну, в класической теории реляционных БД внешний ключ используется для связи таблиц. В MySQL (начиная с 3.5, вроде), он кроме всего прочего юзается для поддержки ссылочной целостности.
Пример:
CREATE TABLE Users
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name NATIONAL VARCHAR(255) NOT NULL
);
CREATE TABLE IF Messages
(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
uid INT UNSIGNED NOT NULL,
INDEX messages_ind(tid),
FOREIGN KEY(uid) REFERENCES Users(id) ON DELETE CASCADE ON UPDATE CASCADE,
) TYPE=INNODB;
Здесь мы создали две таблицы. Одна с инфой о юзерах Users, другая с сообщениями, сделанными юзарами Messages. Между ними есть связь один ко многим (т.е. одному юзеру соотвествуют несколько сообщений).
При этом Messages.uid является внешним ключем для таблицы Messages.
Однако, чтобы задействовать механизмы поодержки ссылочной целостности, приходится немного погемороится.
В частности, мы создаем индекс по внешнему ключу (это требование MySQL) и затем указываем, как следует обрабатывать записи таблицы Messages при изменении соотвествующего им поля id таблицы Users.
В данном случае я поставил каскадное удаление и обновление.
Т.е. если юзер будет удален, то все связанные с ним сообщения удалятся автоматически, а если мы изменим id юзера, то соотвествующим образом изменятся uid всех сделанных этим юзером сообщений.
..........................
Устал - умри!
Когда государство от тебя что-то хочет, оно называет себя Родиной.
All above is just IMHO.
|