Database-Design

創建外鍵引用的表的第一個條目後,如何填寫外鍵值?

  • April 6, 2020

我正在尋求創建一個線上商店,所以我得到了數據庫定義。我希望盡可能少的桌子,所以我把它們縮小到:

  1. 使用者
  2. 產品
  3. 訂單
  4. Cart_Items

我得到了以下架構:圖像

邏輯流程如下: 對於添加到購物車中的每個產品,都會創建一個新的 Cart_Item 條目。但是Cart_Item條目需要填寫引用Order表的外鍵,即cartItemOrderID。由於沒有創建訂單,所以一開始它必須為空。一旦使用者在購物車中添加了他們想要的所有商品,他們就會下訂單,並創建一個新訂單,所以現在我有了 orderID。我如何將此 orderID 傳遞給 Cart_Item 表中的條目,因為無法判斷它們是由目前使用者放置的?

我錯過了一些巨大的東西,但我不能把手指放在它上面。

我認為您的主要挑戰是要求Order介於您的User和之間Cart_Item

我假設您計劃將放入購物車的Cart_Item物品儲存在(計劃購買但目前未購買的物品。此外,每個使用者只有 1 個待購買的物品列表)。然後使用者實際購買的物品(來自他的購物車)將登陸Order。在我看來,“訂單”和“購物車”之間不應該有任何联系。如果有,您需要Cart_ItemIdOrder桌子上儲存某種東西,而不是orderIdon Cart_Item。如果您要保留 a Cart_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 條記錄寫入Order5 行到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

希望這會有所幫助。如果我需要更好地解釋或者這不能回答你的問題,請告訴我。

引用自:https://dba.stackexchange.com/questions/264331