Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   структура бд в MySQL (http://forum.oszone.net/showthread.php?t=31003)

Dutchman Mihel 05-09-2004 15:47 212647

Как задать между таблицами в mysql отношение многие-ко-многим. Вот есть две таблицы: Заказчики и Товары. Одной записи в заказчики может соответствовать несколько в товары и наоборот одной записи товары несколько в заказчики. Какой тут подход может быть?

Vlad Drakula 05-09-2004 18:45 212648

Dutchman Mihel
создай:
таблицу со покупателями
таблицу с товарами
таблицу со связами

Dutchman Mihel 06-09-2004 01:57 212649

Vlad Drakula

Вот про таблицу со связями самое интересное.

Например в access многие-ко-многим делалаются с помощью промежуточной таблицы с индексами (типа ТоварID и ЗаказчикID) оба они -  primary key и связываются со счетчиками в таблицах Товары и Заказчики. Но в mysql в одной таблице не может быть два primary key.  Как быть?

Prisoner 06-09-2004 03:01 212650

Primary key в MySql это уникальный ключ с ограничением на NULL, т.е. значения столбца не могут принримать NULL. Если есть таблица связи 1-n, то, имхо, как минимум один столбец не может быть primary. В общем уникальность это такая штука с которой лучше работать когда нужно что-то нумеровать или не позволить повторяться. В вашем же случае (таблица связи) в этом нет необходимости.

Vlad Drakula 06-09-2004 18:23 212651

Dutchman Mihel
ровно точно также как и в  access, только вместо primary key - key

Guest 07-09-2004 00:40 212652

Prisoner

Vlad Drakula

То есть если я правильно понял мне нужно просто создать промежуточную таблицу с ключиками и остальное делать запросом со множеством  left join'ов.

Prisoner 07-09-2004 02:21 212653

Хм... если есть табличка для связи, то можно без 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 212654

Prisoner

Цитата:

товар "хорошая жизнь".
Все на продажу :gigi:


Обычно я играюсь с частью запроса from и в where у меня все кратко,  так что  спасибо за пример и вообще за ценные советы

mar 08-09-2004 11:32 212655

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

Prisoner 09-09-2004 09:09 212656


Цитата:

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


Sean Ingumsky 09-09-2004 13:17 212657

Prisoner
Цитата:

JOIN'ы терпеть ненавижу
А зря. В некоторых случаях без них вообще никак не обойтись.



Время: 13:41.

Время: 13:41.
© OSzone.net 2001-