創建外鍵引用的表的第一個條目後,如何填寫外鍵值?
我正在尋求創建一個線上商店,所以我得到了數據庫定義。我希望盡可能少的桌子,所以我把它們縮小到:
- 使用者
- 產品
- 訂單
- Cart_Items
我得到了以下架構:圖像
邏輯流程如下: 對於添加到購物車中的每個產品,都會創建一個新的 Cart_Item 條目。但是Cart_Item條目需要填寫引用Order表的外鍵,即cartItemOrderID。由於沒有創建訂單,所以一開始它必須為空。一旦使用者在購物車中添加了他們想要的所有商品,他們就會下訂單,並創建一個新訂單,所以現在我有了 orderID。我如何將此 orderID 傳遞給 Cart_Item 表中的條目,因為無法判斷它們是由目前使用者放置的?
我錯過了一些巨大的東西,但我不能把手指放在它上面。
我認為您的主要挑戰是要求
Order
介於您的User
和之間Cart_Item
。我假設您計劃將放入購物車的
Cart_Item
物品儲存在(計劃購買但目前未購買的物品。此外,每個使用者只有 1 個待購買的物品列表)。然後使用者實際購買的物品(來自他的購物車)將登陸Order
。在我看來,“訂單”和“購物車”之間不應該有任何联系。如果有,您需要Cart_ItemId
在Order
桌子上儲存某種東西,而不是orderId
onCart_Item
。如果您要保留 aCart_ItemId
,那麼您將必須擁有某種購物車歷史記錄,這對我來說似乎是多餘的,因為該數據將保存在您的“訂單歷史記錄”中Order
. 你可能有另一個我沒有想到的目的,所以如果我遺漏了什麼,請告訴我。假設我對您要查找的內容的理解是正確的。我相信這個下面的模式更接近於給你你正在尋找的東西,並讓你解決這個
Foreign Key
問題。(我很抱歉,你的關係圖比我的要好得多。試圖讓它在 Visio 中工作):將數據從您的購物車傳輸到您的訂單可能如下所示:
CREATE PROCEDURE [FinalizeOrder] (@UserID INT, @OrderDetails VarChar(500)) AS BEGIN INSERT INTO Order_Item ( userID, orderProductId, quantity, price, [date], details ) SELECT CI.userID, --userID, CI.cartItemProductID, --orderProductId, CI.quantity, --quantity, P.price, --price, GETDATE(), --[date], @OrderDetails --details FROM Cart_Item CI INNER JOIN Product P ON CI.cartItemProductID = P.ProductId WHERE CI.userID = @UserID DELETE FROM Cart_Item WHERE CI.userID = @UserID END
現在,如果是我,我會創建
Order
表格OrderItems
。這樣,您就不會複製像使用者這樣的數據,或者每個項目的地址資訊。我知道你想限制創建的表,但我認為這會對你有很大幫助。如果那是您最終要走的路線,那麼您將有一個有點像這樣的模式:舉個簡單的例子。假設我是使用者(使用者 ID 13,因為這是我最喜歡的號碼)。我用 5 件商品填寫了一個購物車。表中的記錄
Cart_Item
如下所示:+------------+--------+-------------------+----------+ | CartItemId | UserID | CartItemProductID | quantity | +------------+--------+-------------------+----------+ | 1 | 13 | 123 | 1 | | 2 | 13 | 456 | 2 | | 3 | 13 | 789 | 5 | | 4 | 13 | 123456 | 77 | | 5 | 13 | 56 | 45 | +------------+--------+-------------------+----------+
當我在結帳過程中點擊最後一個“送出”時,我們會將 1 條記錄寫入
Order
5 行到Order_Item
. 這些行看起來像:[ORDER] +----------+--------+----------+--------------------------------------------------------+ | OrderId | UserId | Date | Details | +----------+--------+----------+--------------------------------------------------------+ | 98564745 | 13 | 4/6/2020 | Order Placed by Kirk Saunders on 4/6/2020 for 5 items. | +----------+--------+----------+--------------------------------------------------------+ [ORDER_ITEM] +----------+--------------------+----------+-------+ | OrderID | OrderItemProductID | Quantity | Price | +----------+--------------------+----------+-------+ | 98564745 | 123 | 1 | 1 | | 98564745 | 456 | 2 | 1.5 | | 98564745 | 789 | 5 | 7.98 | | 98564745 | 123456 | 77 | 85.99 | | 98564745 | 56 | 45 | 1065 | +----------+--------------------+----------+-------+
處理此問題的儲存過程可能如下所示:
CREATE PROCEDURE [FinalizeOrder] (@UserID INT, @OrderDetails VarChar(500)) AS BEGIN DECLARE @OrderId INT INSERT INTO [Order] ( userID, [date], details ) VALUES ( @userID, --userID, GETDATE(), --[date], @OrderDetails --details ) SET @OrderId = scope_identity() INSERT INTO Order_Item ( OrderId, OrderItemProductID, Quantity, Price ) @OrderId, --OrderId, CI.cartItemProductID, --OrderItemProductID, CI.Quantity, --Quantity, P.Price --Price FROM Cart_Item CI INNER JOIN Product P ON CI.cartItemProductID = P.ProductId WHERE CI.userID = @UserID DELETE FROM Cart_Item WHERE CI.userID = @UserID END
希望這會有所幫助。如果我需要更好地解釋或者這不能回答你的問題,請告訴我。