Показать полную графическую версию : структура бд в MySQL
Dutchman Mihel
05-09-2004, 15:47
Как задать между таблицами в mysql отношение многие-ко-многим. Вот есть две таблицы: Заказчики и Товары. Одной записи в заказчики может соответствовать несколько в товары и наоборот одной записи товары несколько в заказчики. Какой тут подход может быть?
Vlad Drakula
05-09-2004, 18:45
Dutchman Mihel
создай:
таблицу со покупателями
таблицу с товарами
таблицу со связами
Dutchman Mihel
06-09-2004, 01:57
Vlad Drakula
Вот про таблицу со связями самое интересное.
Например в access многие-ко-многим делалаются с помощью промежуточной таблицы с индексами (типа ТоварID и ЗаказчикID) оба они - primary key и связываются со счетчиками в таблицах Товары и Заказчики. Но в mysql в одной таблице не может быть два primary key. Как быть?
Prisoner
06-09-2004, 03:01
Primary key в MySql это уникальный ключ с ограничением на NULL, т.е. значения столбца не могут принримать NULL. Если есть таблица связи 1-n, то, имхо, как минимум один столбец не может быть primary. В общем уникальность это такая штука с которой лучше работать когда нужно что-то нумеровать или не позволить повторяться. В вашем же случае (таблица связи) в этом нет необходимости.
Vlad Drakula
06-09-2004, 18:23
Dutchman Mihel
ровно точно также как и в access, только вместо primary key - key
Prisoner
Vlad Drakula
То есть если я правильно понял мне нужно просто создать промежуточную таблицу с ключиками и остальное делать запросом со множеством left join'ов.
Prisoner
07-09-2004, 02:21
Хм... если есть табличка для связи, то можно без join:
SELECT
*
FROM
customers
WHERE
(customers.id = cust_goods_lnk.cust_id) AND
(goods.id = cust_goods_lnk.goods_id) AND
(goods.name = 'хорошая жизнь')
Сделали выборку информации о всех клиентах которые заказали в нашем магазине товар "хорошая жизнь". Первые две строки - установка связи меж двумя сущностями - customers и goods через таблицу cust_goods_lnk, причем не всегда нужно устанавливать связь по двум столбцам (к примеру, нам известен номер товара). Может возникнуть возможность использовать DESTINCT в SELECT'е (см. мануал).
Dutchman Mihel
07-09-2004, 20:32
Prisoner
товар "хорошая жизнь".
Все на продажу :gigi:
Обычно я играюсь с частью запроса from и в where у меня все кратко, так что спасибо за пример и вообще за ценные советы
Prisoner
там же явный скрытый JOIN сидит :)
Вообще-то, чем ближе запрос к классике SQL (или, еще точнее, к реляционной алгебре), тем в большинстве случаев оптимальнее, т.к. все равно транслятор СУБД будет этим заниматься (по крайней мере есть надежда, что будет ;))
Prisoner
09-09-2004, 09:09
явный скрытый JOIN
Мне нравится такая формулировка :). Проблема в том, что JOIN'ы терпеть ненавижу :\
Sean Ingumsky
09-09-2004, 13:17
Prisoner
JOIN'ы терпеть ненавижу
А зря. В некоторых случаях без них вообще никак не обойтись.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.