Войти

Показать полную графическую версию : структура бд в 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

Guest
07-09-2004, 00:40
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 у меня все кратко,  так что  спасибо за пример и вообще за ценные советы

mar
08-09-2004, 11:32
Prisoner
там же явный скрытый JOIN сидит :)
Вообще-то, чем ближе запрос к классике SQL (или, еще точнее, к реляционной алгебре), тем в большинстве случаев оптимальнее, т.к. все равно транслятор СУБД будет этим заниматься (по крайней мере есть надежда, что будет ;))

Prisoner
09-09-2004, 09:09
явный скрытый JOIN
Мне нравится такая формулировка :). Проблема в том, что JOIN'ы терпеть ненавижу :\

Sean Ingumsky
09-09-2004, 13:17
Prisoner
JOIN'ы терпеть ненавижу
А зря. В некоторых случаях без них вообще никак не обойтись.




© OSzone.net 2001-2012