как создать таблицу со связью многие ко многим?

O1&g

Новичок
Попробуй это
PHP:
SELECT country.name 
FROM country 
INNER JOIN country_birds ON country.id = country_birds.countryId
INNER JOIN birds ON birds.Id = country_birds.birdsId  
WHERE country.id = {твоя страна}
 

pilot911

Новичок
в таблице связи свой id необязателен по идее - это глубокое заблуждение, id должен быть во всех таблицах, чтобы потом не было проблем с архитектурой
 

DIG

Новичок
Партнер клуба
Автор оригинала: pilot911
id должен быть во всех таблицах, чтобы потом не было проблем с архитектурой
pilot911 наверное не в тему вопрос, можешь в двух словах сказать какие проблемы с архитектурой возникнут, если я сделаю таблицу связей без id, а просто сделаю ключ на два поля?
 

Adelf

Administrator
Команда форума
Угу. Таблица связей не представляет собой никакую сущность.
Хотя всякие phpMyAdmin'ы ругаются когда видят таблицу без примарного ключика.
 

pilot911

Новичок
чтобы иметь первичный ключ из одного поля, а не из двух полей - быстрее происходит вставка и выборка


ПС. Adelf, разве может быть таблица без PRIMARY KEY ?
 

Adelf

Administrator
Команда форума
Может.

Кажется твои представления о СУБД какие-то не совсем реляционные :)

в данном случае животные и страны - это сущности(классы обьектов, если хочешь в терминах ООП). У них должны быть нормальные таблицы с ID. Таблица же связей.. это не сущность.. это инструмент для нас, чтобы образовать сложную связь между двумя таблицами.
Вот например запись в таблице животных с ID 2 - это информация об обьекте Животное с номером 2.
А что ты сможешь сказать о записи под номером 2 в таблице связей?

чтобы иметь первичный ключ из одного поля, а не из двух полей - быстрее происходит вставка и выборка
Бить надо людей, которые при разработке архитектуры думают в первую очередь о производительности. Серьезно. Это убивает проекты на корню. Если ты хочешь чтото поменять просто потому что это будет быстрее работать - то ты это должен делать только если данная вещь в системе реально тормозит при работе. Либо ты большой спец и знаешь что это точно будет тормозить - но лучше так вообще не думать
 

akd

dive now, work later
Команда форума
Adelf, мне практика показала, что с отдельным ид под ПК жить все-таки проще. особенно когда разработка идет долго и циклами. особенно когда существует кто-то над тобой, кто может сказать, "хочу вот вот в этом месте добавить поле регион (читаем поменять ПК) ". а потом через месяц это-же тело говорит, "нет, регион был хреновой идеей - удалите" :)
 

Adelf

Administrator
Команда форума
Мне практика подсказала, что жить проще с хвостом.
Особенно когда живешь долго и циклами.
Особенно когда существует кто-то над тобой и может сказать: "А давай добавим тебе третью руку?" А потом через месяц: "Нет... третья рука тебе не нужна".

Внимание вопрос - причем тут хвост? :)
 

akd

dive now, work later
Команда форума
Внимание ответ - с ним проще жить. :)
 

pilot911

Новичок
Adelf, ты ошибаешься

во-первых, каждая таблица должна иметь первичный ключ

во-вторых, если не укажешь первичный ключ, то мускуль выберет в таблице связей первый столбец в качестве первичного ключа, в котором будет невозможно иметь два одинаковых значения, а значит и связь многие-ко-многим
 

Adelf

Administrator
Команда форума
Что-то у меня бооольшие сомнения по обоим пунктам...

Сейчас посмотрю конечно...(из вежливости)

Add: посмотреть пока не могу, но почти уверен, что это чушь. особенно второй :)
 

baev

‹°°¬•
Команда форума
во-первых, каждая таблица должна иметь первичный ключ

во-вторых, если не укажешь первичный ключ, то мускуль выберет в таблице связей первый столбец в качестве первичного ключа, в котором будет невозможно иметь два одинаковых значения, а значит и связь многие-ко-многим
— полный бред по обоим пунктам.

pilot911, где Вы такого нахватались?
 

akd

dive now, work later
Команда форума
pilot911, по второму пункту, мануал говорит немного не так:

A PRIMARY KEY is a unique index where all key columns must be defined as NOT NULL. If they are not explicitly declared as NOT NULL, MySQL declares them so implicitly (and silently). A table can have only one PRIMARY KEY. If you do not have a PRIMARY KEY and an application asks for the PRIMARY KEY in your tables, MySQL returns the first UNIQUE index that has no NULL columns as the PRIMARY KEY.
 

pilot911

Новичок
ясно, спасибо :)

я про это и говорю.. не может существовать таблица без первичного ключа в мускуле (явного или неявного)
 

HEm

Сетевой бобер
а как приложение может запросить примари кей?
 

akd

dive now, work later
Команда форума
HEm, это, кстати, мне тоже интересно :)

-~{}~ 08.12.09 15:04:

pilot911, может.
mysql> use test;
Database changed
mysql> create table tt1 (col1 int not null, col2 varchar(20) null);
Query OK, 0 rows affected (0.17 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| tt1 |
| tuser |
+----------------+
2 rows in set (0.05 sec)

mysql> insert into tt1 values (1, 'ttt1');
Query OK, 1 row affected (0.08 sec)

mysql> insert into tt1 values (2, 'ttt2');
Query OK, 1 row affected (0.03 sec)

mysql> select * from tt1;
+------+------+
| col1 | col2 |
+------+------+
| 1 | ttt1 |
| 2 | ttt2 |
+------+------+
2 rows in set (0.02 sec)

mysql> show create table tt1;
+-------+-----------------------------------------------------------------------
-------------------------------------------------+
| Table | Create Table
|
+-------+-----------------------------------------------------------------------
-------------------------------------------------+
| tt1 | CREATE TABLE `tt1` (
`col1` int(11) NOT NULL,
`col2` varchar(20) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------
-------------------------------------------------+
1 row in set (0.00 sec)

mysql>
 

HEm

Сетевой бобер
это что то типа SHOW INDEX, нафик оно в обычном приложении с птичками?
 

akd

dive now, work later
Команда форума
еще немного исследований :)

...
mysql> insert into tt1 values (3, 'ttt3');
Query OK, 1 row affected (0.03 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)

mysql> create unique index i1 on tt1 (col1);
Query OK, 3 rows affected (0.25 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> insert into tt1 values (4, 'ttt4');
Query OK, 1 row affected (0.02 sec)

mysql> select last_insert_id();
+------------------+
| last_insert_id() |
+------------------+
| 0 |
+------------------+
1 row in set (0.00 sec)

mysql> show create table tt1;
+-------+-----------------------------------------------------------------------
-----------------------------------------------------------------------------+
| Table | Create Table
|
+-------+-----------------------------------------------------------------------
-----------------------------------------------------------------------------+
| tt1 | CREATE TABLE `tt1` (
`col1` int(11) NOT NULL,
`col2` varchar(20) DEFAULT NULL,
UNIQUE KEY `i1` (`col1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------
-----------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql>

так шо это не для ласт_инсерт_ид().

-~{}~ 08.12.09 15:23:

ну шо, пора вызывать тяжелую артилерию... :)

Апельсина или Света Смирнова, обьясните плизь, шо значит "application asks for the PRIMARY KEY"?
 

Adelf

Administrator
Команда форума
Ну что за бред тут начал твориться? :)

читайте мануалы. Last_insert_id - это значение последнего сгенерированного autoincrement.

Я не скажу точно но скорее всего приложение запрашивать ID может для запросов вида select ... for update. Не знаю есть ли это в мускуле.

pilot911
Ты так и не ответил - откуда ты этого нахватался? :) преподаватель информатики рассказал?

-~{}~ 08.12.09 17:30:

Слегка в тему - http://ru.wikipedia.org/wiki/Суррогатный_ключ

-~{}~ 08.12.09 17:33:

Посмотрел. FOR UPDATE в MySQL есть. Так что это скорее всего тот самый случай.
Но в вебе его не юзают. Не могу представить случай, когда он бы понадобился. Не та идеология.
 
Сверху