簡體   English   中英

類別和子類別表結構-MySQL

[英]Categories and Subcategories Table Structure - mysql

管理員可以創建多個類別和子類別。

例如什么管理員可以:

cat1                            cat2
   ->sub1                         ->sub1
   ->sub2                            ->sub1_1
   ->sub3
      ->sub3_1
      ->sub3_2
         ->sub3_2_1
         ->sub3_2_2
   ->sub4
      sub4_1
   -sub5

我不知道什么是最好的選擇? 我應該一張桌子還是兩張桌子?

這就是我所知道的:

id    title   parent_cat_id

1      cat1        0
2      sub1        1
3      sub2        1
3      sub3        1
4      sub3_1      3
5      sub3_2      3
6      sub3_2_1 5
7      sub3_2_2 5
...  

類別和子類別都只是邏輯上的“類別”,因此除非您的設計有特定要求,否則無需實現多個物理表(盡管我現在不能想到一個...)。

另外,不需要為層次結構中的每個級別都專門設計一個結構。 您只需要一個表,就可以在每個“類別”(或“子類別”)級別將具有自引用聯接的表返回到父級。

在此示例中,我假設您的類別(或子類別)可能包含以下元素:

// categories table 
category_id
category_name
element 
parent_category_id

該解決方案很優雅,可以在不更改表的情況下擴展層次結構。

頂級類別的DML使用謂詞“ parent_category_id IS NULL”進行。

使用謂詞“ parent_category_id ='無論父類別ID是什么”來制作用於較低級別類別(或子類別)的DML。

干杯斯科特

PS我沒有足夠的代表來響應目錄對Sherif的回答,我可能(可能讀到了)缺少一些東西,但是也可以用單個表實現修改后的預遍歷(或嵌套集)。 方法和與鄰接表的比較在本文檔中有很好的描述

我確實同意Sherif描述的每種方法的利弊。

最好是一個相對術語,但是我們當然可以探索在關系DBMS中存儲分層數據結構的可用解決方案的取舍。 關系數據庫往往是平面結構,因為它們通常被歸一化為二維表,由有趣的列組成。 這使得嵌套結構的想法很難存儲在這樣的數據庫中。

有兩種常見的方法將這種類型的數據存儲在關系數據庫中。 具體來說,作為鄰接表 ,或使用修改的預遍歷

  • 鄰接表方式

    • 優點

      • 易於實施和理解
      • 您可以輕松地將較大的子類別遷移到另一個父類別
      • 無論結構增長多大,都不會對數據庫進行大量寫入
    • 缺點

      • 讀取成本高得多( 需要大量的迭代/遞歸才能重建結構
      • 易於在SQL中破壞數據(SQL不執行遞歸)
  • 使用預遍歷

    • 優點

      • 在SQL中更容易找到所有父母
      • 更容易不破壞SQL中的數據
      • 便宜地建造整棵樹
    • 缺點

      • 實施起來有點困難
      • 插入/更新的成本隨着結構的加深而增加

現在,你的情況而言,這並不重要,如果你有title中存儲你的表列idparent_id ,因為你的主鍵完全取決於parent_id

鄰接表方法與您在問題中說明的方法類似。 您不需要兩個表來執行此操作,因為您使用idparent_id字段作為鄰接表來構成和分解結構。

預先遍歷確實需要使用兩個表(一個用於存儲案例名稱或title ,另一個用於存儲父級與其子級之間的關系)。 而不是存儲的id ,並parent_id每一行中,你需要存儲的leftright的每個父節點的子節點。

categories table
----------------
id    title
1     cat1
2     subcat1_1
3     subcat1_2
4     subcat1_2_1



Relationship table
------------------
parent_id      left      right
------------------------------
1              2         3
3              4         NULL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM