Database-Design

如果父表在多個子表中被引用,那麼數據庫的架構應該是什麼?

  • November 11, 2020

我的數據庫中有三個實體:類別、子類別和產品。現在事情是 SubCategory 依賴於 Category,而 Product 可以依賴於 SubCategory 或直接依賴於 Category。我應該如何為這種情況設計數據庫?

到目前為止,我已經創建了這些表,如下所示:

類別:

  • 類別 ID
  • 分類名稱
  • 有子類別

子類別:

  • 子類別 ID
  • 類別 ID
  • 子類別名稱

產品:

  • 產品編號
  • 類別 ID
  • 子類別 ID
  • 產品名稱

現在,在創建產品時,如果所選類別的 HasSubCategory 為 true,則使用者將選擇 SubCategory。現在考慮這樣一種情況,使用者選擇了一個 HasSubCategory 為 true 的 Category,根據選擇的 Category 載入 SubCategories,選擇一個 SubCategory 後,使用者送出 Product 記錄。現在,如果使用者修改了在 Product 中選擇的 SubCategory 記錄,並更改了其依賴的 Category 怎麼辦。在這種情況下,我還需要更新產品記錄並根據子類別記錄中選擇的新類別更改其類別。

有沒有更好的方法來處理這種情況,或者我只能這樣處理?

我在模型中的方法:

-- Categories and subcategories table
CREATE TABLE category (id INT PRIMARY KEY, 
                      name VARCHAR(255), 
                      parent_id INT,
                      FOREIGN KEY (parent_id) REFERENCES category (id));

-- Products table
CREATE TABLE product (id INT PRIMARY KEY,
                     name VARCHAR(255),
                     category_id INT,
                     FOREIGN KEY (category_id) REFERENCES category (id));

它是如何工作的:(DEMO使用 MySQL)。

查詢被轉換為過程 - 僅用於簡化它們的執行呼叫。

如果某些部分是空的,我們不會顯示它。

如果我們想獲取包含資訊的類別列表,它們是否有子類別,我們只需執行

SELECT *, EXISTS ( SELECT 1
                  FROM category t2
                  WHERE t1.id = t2.parent_id ) has_subcategory
FROM category t1;

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