93217
最終的にやりたいこと  
親子孫階層カテゴリーをPHPで表示したい

Q  
検索したら、[[PHP]
親、子、孫のカテゴリを登録・表示するサンプルを作成してみた【再帰関数版】](https://nprog256.net/post/2020/03/create-
sample-register-and-show-category-hierarchy-by-recursive-
function/)が見つかったのですが、下記のようなデータをPHPで取得するためには、MySQLテーブル構成はどうすればよいですか？  
・'cat''subcat''subsubcat'の 3 つのテーブルを作る？  
・あるいは、どのようなテーブル構成にしても、下記構成のデータは取得できますか？

```

    46$files = [
    47  'file1' => [
    48      'cat' => '本',
    49      'subcat' => 'プログラミング',
    50      'subsubcat' => 'php',
    51  ],
    52  'file2' => [
    53      'cat' => '仕事',
    54      'subcat' => 'プログラミング',
    55      'subsubcat' => 'php',
    56  ],
    57  'file3' => [
    58      'cat' => '仕事',
    59      'subcat' => '転職',
    60      'subsubcat' => 'it業界',
    61  ],
    62  'file4' => [
    63      'cat' => '本',
    64      'subcat' => '自己啓発',
    65  ],
    66  'file5' => [
    67      'cat' => 'Amazon',
    68  ],
    69];
    
```

※最適と思われるテーブル構成を知りたいです

環境  
MySQL 5.7  
PHP 7.2

* * *

要件を修正＆追記しました。  
階層の深さは、親子孫までの 3 階層が必須。  
それより深い階層については、長所短所を把握したうえで決めたい。  
※構成が複雑になったり速度に支障が出るようなら 3 階層までにしたい。  
また、カテゴリー名は重複しません。※'プログラミング'が重複していた前提データは修正しました

```

    46$files = [
    47  'file1' => [
    48      'cat' => '本',
    49      'subcat' => 'プログラミング',
    50      'subsubcat' => 'php',
    51  ],
    52  'file2' => [
    53      'cat' => '仕事',
    54      'subcat' => 'プログラマー',
    55      'subsubcat' => '派遣',
    56  ],
    57  'file3' => [
    58      'cat' => '仕事',
    59      'subcat' => '転職',
    60      'subsubcat' => 'it業界',
    61  ],
    62  'file4' => [
    63      'cat' => '本',
    64      'subcat' => '自己啓発',
    65  ],
    66  'file5' => [
    67      'cat' => 'Amazon',
    68  ],
    69];
    
```
CC BY-SA 4.0
2023-01-06T02:29:35.370
93206
2023-01-10T17:24:05.553
2023-01-10T17:24:05.553
7886
7886
question
php mysql
親子孫階層構造データのMySQLテーブル構成について
要件に関する記載が少なすぎてDBの正規化がしづらい状況かと思います。

例えば`subcat`が`プログラミング`で同じでも、親である`cat`が別カテゴリなので`subcat`の`プログラミング`も別のカテゴリとして扱って良いのか。  
階層の深さに上限はあるのか。などもう少し、やりたいことの要件を記載してほしいです。

別のカテゴリとして扱って良く、親子孫階層カテゴリーの階層が深くならないのであれば、以下の2つのテーブルがあれば実現できるかと思います。

  1. カテゴリテーブル
  2. カテゴリとファイルを紐付けるテーブル

各テーブルの大まかな構造は以下の通り。

  * カテゴリテーブル

カテゴリID | 親カテゴリID | カテゴリ名  
---|---|---  
1 |  | 本  
2 |  | 仕事  
3 |  | Amazon  
4 | 1 | プログラミング  
5 | 2 | プログラミング  
6 | 2 | 転職  
7 | 1 | 自己啓発  
8 | 4 | php  
9 | 5 | php  
10 | 6 | it業界  
  
  * カテゴリとファイルを紐付けるテーブル

ファイルID | ファイル名 | カテゴリID  
---|---|---  
1 | file1 | 8  
2 | file2 | 9  
3 | file3 | 10  
4 | file4 | 7  
5 | file5 | 3  
  
上記の2つのテーブルであれば、ファイルのリストをDBから取得したついでに、最下層のカテゴリIDを取得することになるので、  
後はPHP側で「カテゴリ名と親カテゴリIDを取得する」関数を親カテゴリが無くなるまで再帰的実行すれば要望の構成を実現することはできるかと思います。

質問の例ですと3階層までしかないので、4階層以上があり得るか判断できませんが、  
上記のカテゴリテーブルであれば、再帰的な構造なので理論上は何階層でもできます。  
※階層が深くなると再帰関数の呼び出しが増えるのでオススメはしませんが。  
また、階層の深さによって`subsubcat`の部分も`subsubsubcat`の様に変えていくのであれば、再帰呼び出しの際にカウントすることで、対象のカテゴリの深さは判別かのうかと思います。

後は、要件に合わせてカラムを追加するなり、テーブルを分離するなりしてください。

こちらで回答の助けになってますか？
CC BY-SA 4.0
2023-01-06T09:26:15.807
93217
2023-01-06T09:26:15.807
56419
93206
answer