1

階層構造を容易にするために自己参照テーブルを利用するレガシーアプリケーションを継承しました。これにより、再帰的なメソッド呼び出しが発生し、「悪臭」が発生します。

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

4

1 に答える 1

0

最終的に、既存の自己参照テーブルを破棄しました。そして、より単純なモデルを収容するための新しいテーブルを作成しました。

上記のリンクを提供してくれたSebasに感謝します。そこにはたくさんの良さがあります!

于 2012-07-26T11:12:27.897 に答える