2

我想創建一個電子商務/商店系統,我決定在基於this great answer的SQL設計中選擇類表繼承設計。商店產品的類表繼承:如何下訂單

現在我有如下表結構:

product (id [PK], name, description) 
product_shirt (id [PK], product_id [FK], color, size, stock, price) 
product_ring (id [PK], product_id [FK], size, stock, price) 
// maybe coming more 

這適用於網站上的產品的代表。但如果我想訂購一些產品,這將如何工作?

如果我有一張表用於我的產品,我可以將product_id作爲外鍵分配給關係表,但對於多個表,這似乎不再可行了。類表繼承有可能嗎?

我已經看了很多,大多數答案/教程似乎集中在產品的表示,但不是在客戶的秩序。

回答

4

落場product_idproduct_shirtproduct_ring,使他們的id領域都主鍵外鍵product.id

您的order_item表將包含product.id的外鍵。

當您需要按給定順序提取有關產品的信息時,請僅通過連接進行查詢,並將其添加到product。當您需要特定產品的完整詳細信息時,還可以根據實際產品類型加入product_shirtproduct_ring


例子:

-- red XL shirt: product #1 
INSERT INTO product VALUE (1, 'Red XL shirt', 'What a lovely shirt'); 
INSERT INTO product_shirt VALUE (1, 'XL', 'red', 1, 12); 

-- blue S shirt: product #2 
INSERT INTO product VALUE (2, 'Blue S shirt', 'How nice a shirt'); 
INSERT INTO product_shirt VALUE (2, 'S', 'blue', 1, 12); 

-- small ring: product #3 
INSERT INTO product VALUE (3, 'Small ring', 'One to rule them all'); 
INSERT INTO product_ring VALUE (3, 'S', 1, 5); 

-- customer orders a "Blue S shirt" and a "Small ring": 
INSERT INTO order_item VALUES (
    1, -- order_number 
    2, -- product_id 
    1, -- quantity 
), (
    1, -- order_number 
    3, -- product_id 
    1, -- quantity 
); 

-- overview of the basket 
SELECT * FROM order_item 
JOIN product ON product.id = order_item.product_id 
WHERE order_number = 1; 

-- details of the basket contents 
-- -- this will only show details pertaining to products of type "shirt", if any 
SELECT * FROM order_item 
JOIN product ON product.id = order_item.product_id 
JOIN product_shirt ON product_shirt.id = product.id 
WHERE order_number = 1; 

-- -- this will only show details pertaining to products of type "ring", if any 
SELECT * FROM order_item 
JOIN product ON product.id = order_item.product_id 
JOIN product_ring ON product_ring.id = product.id 
WHERE order_number = 1; 

-- notice you cannot UNION these results as we expect a different number of columns 
-- your application classes are expected to handle these differences 
+0

感謝您的答覆。我的子表提供產品變體。像有些襯衫是紅XS XS,紅S,紅L等。現在在我的'order_item'中,我無法指定選擇了哪個變體。只有父級產品ID。 –

+0

'order_item'不需要「指定」選擇了哪個變體,這個信息可以從外鍵(到'product.id')推導出來。看到我上面的編輯。 – RandomSeed

+0

啊,現在我明白了,子表只提供了更多關於產品本身的元數據。每個變體仍然需要自己的條目。這對我來說有點令人費解。謝謝你的幫助。 –

相關問題