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

— этот форум работает с 03 октября 2005 года. ️‍🔥️‍🔥
(#1)
Старый 06.06.2007
Question Вопрос по 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;
Зарание спасибо...
Manago Manago вне форума
Прохожий
Manago Первый уровень
 
Регистрация: 06.06.2007
Сообщений: 3 шт.
Карма: 0 бал.
Ответить с цитированием
(#2)
Старый 09.06.2007
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.
DEV DEV вне форума
Присматривается
DEV Первый уровень
 
Аватар для DEV
 
Регистрация: 10.02.2007
Сообщений: 52 шт.
Карма: 10 бал.
Ответить с цитированием
(#3)
Старый 09.06.2007
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 или как то зделать выборку по другому... (и как здесь можно применить ключи)

Последний раз редактировалось Manago; 09.06.2007 в 23:10. Причина: ????????? ?????????
Manago Manago вне форума
Прохожий
Manago Первый уровень
 
Регистрация: 06.06.2007
Сообщений: 3 шт.
Карма: 0 бал.
Ответить с цитированием
(#4)
Старый 10.06.2007
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
..........................
Устал - умри!
Когда государство от тебя что-то хочет, оно называет себя Родиной.
All above is just IMHO.
DEV DEV вне форума
Присматривается
DEV Первый уровень
 
Аватар для DEV
 
Регистрация: 10.02.2007
Сообщений: 52 шт.
Карма: 10 бал.
Ответить с цитированием
(#5)
Старый 10.06.2007
Re: Вопрос по MySQL

Все спасибо...
Manago Manago вне форума
Прохожий
Manago Первый уровень
 
Регистрация: 06.06.2007
Сообщений: 3 шт.
Карма: 0 бал.
Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MYSQL Serghant Технический 3 26.02.2008 13:00
Кодировка mysql blazdie Веб-мастерам 2 05.12.2006 13:51
проблема с mysql blazdie Технический 8 04.11.2006 01:25

Powered by vBulletin® Version 3.8.11 PL4;
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd;
Оператор обработки ПДн - ИП Алексеев А.С.;
ИНН: 333411310227; ОГРН: 307333419200050;
тел. +7 (4922) 49-42-22, legal@smalta.net;
Часовой пояс GMT +3, время: 02:27.
Любые сообщения на Альтернативном Форуме — являются субъективным отражением реальности, написавших их авторов и публикуются без предварительной модерации. Администрация форума не принимает на себя ответственность за содержание таких материалов. В рамках функционирования форума осуществляется хранение ограниченного набора данных: имя пользователя, адрес электронной почты, IP-адрес (в момент входа) и cookie для поддержки сессии. Метаданные пользователей обрабатываются и направляются в уполномоченные органы только при наличии официального запроса в порядке, установленном законодательством РФ. В случае выявления противоправного контента, пожалуйста, направляйте уведомление через кнопку «Жалоба» или форму обратной связи.
ИКС