我试图了解多对多关系中“额外”表的必要性。
例如,如果我的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 :(得分: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"
您使用的具体取决于您是否知道产品ID或是否需要查看产品名称或其他属性。
如果您需要知道工厂可以生产哪些产品,那么查询几乎是对称的:
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"
请注意,因为您将对表具有参照完整性约束,所以可以使用内部联接而不是外部联接,这通常更有效。
答案 1 :(得分:1)
拥有和属于多对的关系意味着双方都可以属于彼此的倍数。
在这种情况下:
表示这一点的唯一方法是拥有一个“连接”表,因为工厂表和产品表中的每个项目只代表一个不同的产品或工厂,没有这样的表,没有办法将它链接到多个其他项目
答案 2 :(得分: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?
等等。