2013-02-19 3 views
0

Я пытаюсь понять необходимость «лишней» таблицы во многих отношениях.Какова цель дополнительной таблицы во многих отношениях?

Например, если мой ERD имеет: Product m----- <makes> ----n Factory, следующий код для таблиц может выглядеть следующим образом:

CREATE TABLE factory(

     factory_id  INTEGER   NOT NULL, 
     address   VARCHAR(30)  NOT NULL, 
CONSTRAINT PK_factory_factory_id PRIMARY KEY(factory_id) 
); 


CREATE TABLE product(

     prod_id   INTEGER   NOT NULL, 
     prod_name  VARCHAR(30)  NOT NULL, 
     price   FLOAT   NOT NULL, 
CONSTRAINT PK_product_prod_id PRIMARY KEY(prod_id) 
); 


CREATE TABLE makes(

     prod_id   INTEGER   NOT NULL, 
     factory_id  INTEGER   NOT NULL, 
CONSTRAINT PK_makes_prod_id_factory_id PRIMARY KEY(prod_id, factory_id), 
CONSTRAINT FK_product_prod_id FOREIGN KEY(prod_id) REFERENCES product(prod_id), 
CONSTRAINT FK_factory_factory_id FOREIGN KEY(factory_id) REFERENCES factory(factory_id) 
); 

Какова цель таблицы делает? Я не могу думать о времени, когда вы можете использовать его или почему это необходимо.

+0

'invoice' -' invoiceLine' обычно не является отношением «многие ко многим». Фактически, это обычно используется как классическое отношение «Мастер-Деталь» («один ко многим»). Это может усложнить понимание. Вместо этого подумайте о взаимоотношениях между «Клубами» и «Членами». – RBarryYoung

ответ

1

Как бы вы зафиксировали тот факт, что один продукт может быть изготовлен на каждом из N заводов без него?

  • Вы не можете сохранить один заводский номер в таблице продуктов; существует множество возможных значений.
  • Вы не можете сохранить один номер продукта в заводской таблице; существует множество возможных значений.

Итак, вам нужна третья таблица для аккуратного хранения информации.

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

SELECT f.* 
    FROM Factory AS f 
    JOIN Makes AS m ON m.factory_id = f.factory_id 
WHERE f.prod_id = 123456; 

Или:

SELECT f.* 
    FROM Factory AS f 
    JOIN Makes AS m ON m.factory_id = f.factory_id 
    JOIN Product AS p ON m.prod_id = p.prod_id 
WHERE p.prod_name = "HyperCubic Widget" 

Что вы используете, зависит от знаете ли вы код продукта или вам нужно искать название продукта или другие атрибуты ли.

Запросы почти симметричны, если вы должны знать, какие продукты фабрика может сделать:

SELECT p.* 
    FROM Product AS p 
    JOIN Makes AS m ON m.prod_id = f.prod_id 
WHERE f.factory_id = 321; 

Или:

SELECT p.* 
    FROM Product AS p 
    JOIN Makes AS m ON m.prod_id = p.prod_id 
    JOIN Product AS p ON m.factory_id = f.factory_id 
WHERE f.address = "123 North St, Bigtown" 

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

+0

возможно, чтобы пояснить, не могли бы вы привести пример того, как вы могли бы создать запрос для просмотра нескольких заводов, которые могли бы сделать один продукт – ZAX

1

Отношения «has-and-of-to-many» подразумевают, что обе стороны могут принадлежать кратным друг другу.

В этом случае:

  • Несколько заводов могут сделать один продукт
  • Один завод может сделать несколько продуктов

Единственный способ представить это иметь «присоединиться» стол , так как каждый элемент в заводской таблице и таблице продуктов представляет только один отдельный продукт или завод, нет способа связать его с несколькими другими элементами без такой таблицы.

+0

, возможно, чтобы пояснить, можете ли вы представить пример того, как вы затем создавали запрос для просмотра несколько заводов, которые могли бы сделать один продукт? – ZAX

+0

Sure @ZAX - вы можете использовать что-то вроде следующего, где вы бы заменили «123» идентификатором продукта, который хотите найти заводы: 'SELECT factory.name FROM factory_product LEFT JOIN factory ON factory.id = factory_product.factory_id WHERE factory_product.id = 123' – toomanyredirects

0

Вот некоторые вопросы, которые вы ответили бы с ним:

What products does a single factory make? 

What factories make a particular product? 

What factories make the same product as factory F? 

What factories can be used to fulfill an order that that has products P1, P2, and P3? 

Where is the closest factory to the customer who wants production P? 

Where is the next closest factory? 

И так далее.

Смежные вопросы