2012-07-12 55 views
1

我已经继承了一个遗留应用程序,它利用自引用表来促进分层结构。这导致递归方法调用正在产生“难闻的气味”。重新设计自引用mysql表

的PARENT_ID列引用同一个表的主键,这里有大约25万条记录:

+-------------+---------+------+-----+---------+----------------+ 
| 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

+0

可能的[在关系数据库中存储分层数据的选项是什么?]的重复(http://stackoverflow.com/questions/4048151/what-are-the-options-for-storing-hierarchical-data-关系数据库) – Sebas 2012-07-12 14:10:02

+0

感谢您的链接Sebas,我没有在我的搜索中找到。本文中描述的'平板模型'听起来非常好:http://www.ferdychristant.com/blog//articles/DOMM-7QJPM7 – nonshatter 2012-07-12 14:33:39

+1

是的,这是一个非常有趣且富有挑战性的主题。 – Sebas 2012-07-12 14:35:09

回答

0

我们结束了再杀现有自参照表。并创建了一个新表来容纳更简单的模型。

感谢Sebas以上的Link。那里有很多善良!