Альтернативный Форум

Альтернативный Форум (https://af.net.ru/index.php)
-   Веб-мастерам (https://af.net.ru/forumdisplay.php?f=124)
-   -   Вопрос по MySQL (https://af.net.ru/showthread.php?t=4755)

Manago 06.06.2007 16:32

Вопрос по MySQL
 
Нужна помощь по нескольким вопросам с которыми не удалось разобраться самостоятельно:

1) Для чего нужна индексация таблиц и в каких случаях ее применять?
2) Для чего нужен внешний ключ?

Пример:
CREATE TABLE logs (id int(3) AUTO_INCREMENT,
r_id int(255) default NULL,
...
PRIMARY KEY (id),
KEY r_id (r_id)
) TYPE=MyISAM;
Зарание спасибо...

DEV 09.06.2007 18:04

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 всех сделанных этим юзером сообщений.

Manago 09.06.2007 22:39

Re: Вопрос по MySQL
 
Вобщем смыл понятен... спасибо за подробный ответ...

Добавлено через 31 минуту
И вот еще один вопрос...

есть 2-е таблицы: users, thems
нужно выбрать в одном запросе:
user, content из тбл. users
posts_all, avatar из тбл. thems
с одинаковым полем user

Вот этот запрос рабочий:
SELECT user, content, (SELECT posts_all FROM users a WHERE a.user=user) AS posts_all, (SELECT avatar FROM users a WHERE a.user=user) AS avatar FROM thems WHERE t='$t' AND pt='$pt';

но в нем есть минус: вложеный селект, который делает выборку из таблицы thems разделен на 2-а... Вобщем то это небольшой минус, но вобще интересно как можно объеденить этот SELECT или как то зделать выборку по другому... (и как здесь можно применить ключи)

DEV 10.06.2007 12:44

Re: Вопрос по MySQL
 
Если я правильно понял, то:
1. SELECT u.user p.content, t.avatar FROM users AS u, posts_all AS p, thems AS t
WHERE (u.user = p.user AND u.user = t.user)
2. SELECT u.user, p.content, t.avatar FROM users AS u
INNER JOIN posts_all AS p ON u.user = p.user
INNER JOIN themes AS t ON u.user = t.user

Manago 10.06.2007 20:36

Re: Вопрос по MySQL
 
Все спасибо...


Часовой пояс GMT +3, время: 03:58.

Powered by vBulletin® Version 3.8.11 PL4;
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd;
Оператор обработки ПДн - ИП Алексеев А.С.;
ИНН: 333411310227; ОГРН: 307333419200050;
тел. +7 (4922) 49-42-22, legal@smalta.net