SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.09.2010 14:42:41

fenuk
Участник
Зарегистрирован: 30.07.2010
Сообщений: 19

задать правильную структуру таблицы

Сейчас есть таблица со следующими полями: id, name, description. И теперь надо связать эту таблицу с другими таблицами, вернее,  другие таблицы надо будет связать с этой.

По полю name - связывать не можем, оно может меняться, тоже самое и с полем description. Делать связь по id - это же тоже не правильно. Значит необходимо вводить какое то новое дополнительное поле, правильно? которое будет нашим foreign key

Неактивен

 

#2 10.09.2010 15:04:21

vaspet
Завсегдатай
Зарегистрирован: 11.03.2009
Сообщений: 83

Re: задать правильную структуру таблицы

А для чего по Вашему id?
Как раз очень хорошо подходит для связей.

Кстати можно делать связи по любому полю и даже по нескольким полям

Неактивен

 

#3 10.09.2010 15:20:30

fenuk
Участник
Зарегистрирован: 30.07.2010
Сообщений: 19

Re: задать правильную структуру таблицы

ааа, тогда давайте уточним одну деталь. Сделали связь по name. Если я хочу изменить значение name - то оно мне даст это сделать? и будут ли автоматом сделаны замены в связных таблицах или же нет?

Неактивен

 

#4 10.09.2010 17:39:17

fenuk
Участник
Зарегистрирован: 30.07.2010
Сообщений: 19

Re: задать правильную структуру таблицы

да, таки нельзя менять значение поля, если уже существуют связи. Значит утверждение:

"Кстати можно делать связи по любому полю и даже по нескольким полям" - в данном ситуации неверно.

Неактивен

 

#5 11.09.2010 22:08:16

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: задать правильную структуру таблицы

Менять значение при наличии связи можно. Например, если отец меняет имя, то у детей отчество меняется автоматически; а вот если, ребенок хочет изменить отчество, то да, таки нельзя.

Про внешние ключи см FAQ №4.


Что же касается вашей ситуации, то широкой аудитории про неё ничего не известно, так как телепатия не входит в число наших достоинств wink

Неактивен

 

#6 18.09.2010 15:50:55

fenuk
Участник
Зарегистрирован: 30.07.2010
Сообщений: 19

Re: задать правильную структуру таблицы

я воспользовался ссылками приведенными в FAQ. Особенно детально изучил информацию приведенную тут: http://webew.ru/posts/219.webew

Однако у меня возник вопрос:  в статье, в качестве примеров были созданы две таблицы:

CREATE TABLE customers (
    userid INT NOT NULL UNIQUE KEY,
    name VARCHAR(255) /* и т.п. */
) ENGINE = InnoDB;

CREATE TABLE orders (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    cid INT /* id покупателя */
     /* и т.д. */
) ENGINE = InnoDB;

и установлена связь:

ALTER TABLE orders
ADD FOREIGN KEY (cid)
REFERENCES customers(userid)
ON UPDATE CASCADE
ON DELETE CASCADE ;


так вот у меня такой вопрос, почему поле customers.userid объявлено ИМЕННО КАК:  NOT NULL UNIQUE KEY?
почему не использовано   NOT NULL AUTO_INCREMENT PRIMARY KEY как для поля orders.id?

Неактивен

 

#7 18.09.2010 16:12:37

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: задать правильную структуру таблицы

Хм. Я думаю, что Миша просто скопировал какие-то реальные таблички, а несущественные
для примера поля выкинул. Вот и получилось, что там UNIQUE smile

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

Неактивен

 

#8 18.09.2010 16:27:08

fenuk
Участник
Зарегистрирован: 30.07.2010
Сообщений: 19

Re: задать правильную структуру таблицы

ааа, хорошо, тогда что бы окончательно разобраться, скажите мне, пожалуйста,  мы можем считать NOT NULL UNIQUE KEY равнозначным PRIMARY KEY?

ведь, PRIMARY KEY - это уникальный(UNIQUE) индекс, который не может быть пустым (NOT NULL), то есть в сумме получаем: PRIMARY KEY =  NOT NULL UNIQUE KEY.

Единственное различие только в том, что PRIMARY KEY - один на всю таблицу, а UNIQUE KEY - сколько нам будет нужно (ограничение какое то есть не помню сколько). Я правильно все понял?

Неактивен

 

#9 18.09.2010 22:07:46

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: задать правильную структуру таблицы

fenuk написал:

ааа, хорошо, тогда что бы окончательно разобраться, скажите мне, пожалуйста,  мы можем считать NOT NULL UNIQUE KEY равнозначным PRIMARY KEY?

Нет. Например, только primary key может быть auto_increment.
Для innodb любой ключ, отличный от первичного, содержит указатель не на данные, а на значение первичного ключа.

Неактивен

 

#10 19.09.2010 02:49:18

fenuk
Участник
Зарегистрирован: 30.07.2010
Сообщений: 19

Re: задать правильную структуру таблицы

vasya написал:

Нет.

Индексы PRIMARY KEY и UNIQUE подобны. Индекс PRIMARY KEY является индексом UNIQUE с именем PRIMARY. Это означает, что таблица может иметь только один индекс PRIMARY KEY, потому что двух индексов одной таблицы с одинаковым именем быть не может. Можно создать несколько индексов UNIQUE.

MySQL. Поль Дюбуа

Неактивен

 

#11 19.09.2010 03:24:36

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: задать правильную структуру таблицы

Подобны и равнозначны - разные понятия.
Что же касается фразы "Индекс PRIMARY KEY является индексом UNIQUE с именем PRIMARY.", подозреваю, что это особенности перевода на русский wink

Неактивен

 

#12 19.09.2010 03:39:14

fenuk
Участник
Зарегистрирован: 30.07.2010
Сообщений: 19

Re: задать правильную структуру таблицы

vasya написал:

Подобны и равнозначны - разные понятия.
Что же касается фразы "Индекс PRIMARY KEY является индексом UNIQUE с именем PRIMARY.", подозреваю, что это особенности перевода на русский wink

значит Воронина и Мартусенко - две гадины smile

Неактивен

 

#13 19.09.2010 15:24:36

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: задать правильную структуру таблицы

На самом деле, Дюбуа прав отчасти, и переводчики нормальные smile

В случае MyISAM можно сказать, что PRIMARY — это действительно UNIQUE NOT NULL.
В случае с InnoDB у PRIMARY есть дополнительная особенность: это кластерный индекс.
Всё остальное является так или иначе следствием кластерности.

Неактивен

 

#14 19.09.2010 20:01:29

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: задать правильную структуру таблицы

Ну, только PRIMARY может иметь атрибут auto_increment и его (PRIMARY) нельзя создать с помощью CREATE INDEX.
Я являюсь сторонником деления: PRIMARY, UNIQUE, non-UNIQUE, FULLTEXT..
"Министерство пропаганды" в этом со мной солидарно, выделяя PRIMARY в отдельный тип: wink

http://dev.mysql.com/doc/refman/5.1/en/mysql-indexes.html написал:

Most MySQL indexes (PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT) are ..

Что же касается

fenuk написал:

vasya написал:

Что же касается фразы "Индекс PRIMARY KEY является индексом UNIQUE с именем PRIMARY.", подозреваю, что это особенности перевода на русский wink

значит Воронина и Мартусенко - две гадины smile

нехорошо беспричинно оскорблять людей. В том, что переводчики здесь не при чем легко убедиться открыв первоисточник:
http://reslib.com/book/27663
127 страница.

Неактивен

 

#15 20.09.2010 01:39:54

fenuk
Участник
Зарегистрирован: 30.07.2010
Сообщений: 19

Re: задать правильную структуру таблицы

Ребята, спасибо за помощь.

vasya, спасибо за ссылку на http://reslib.com.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson