階層構造を容易にするために自己参照テーブルを利用するレガシーアプリケーションを継承しました。これにより、再帰的なメソッド呼び出しが発生し、「悪臭」が発生します。
parent_id列は同じテーブルの主キーを参照し、ここには約2,500万件のレコードがあります。
+-------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+----------------+
| phase_id | int(10) | NO | PRI | NULL | auto_increment |
| plat_id | int(10) | YES | MUL | NULL | |
| name | text | YES | | NULL | |
| parent_id | int(10) | YES | MUL | NULL | |
| plan_id | int(10) | YES | MUL | NULL | |
+-------------+---------+------+-----+---------+----------------+
mysql> show table status like 'ref'\G
*************************** 1. row ***************************
Name: phase
Engine: MyISAM
Version: 10
Row_format: Dynamic
Rows: 25223658
Avg_row_length: 20
Data_length: 509450960
Max_data_length: 281474976710655
Index_length: 1026267136
Data_free: 0
Auto_increment: 25238013
この種の構造についていくつか質問があります。
- 自己参照テーブルを実装することは一般的に悪い習慣ですか?私が考えることができる主な欠点は、X個の子が存在する可能性があるため、単一のクエリで階層の最大の深さを取得することが困難/不可能であるということです。
- これを再設計する価値はありますか?データが多すぎると、データを移動するのが難しくなります。
- 私のオプションは何ですか?テーブルのパーティション分割について少し聞いたことがありますが、それが私のシナリオに適しているかどうかはわかりません。
どんなポインタでも本当にありがたいです ns