我有一张表格,名为Models
,其中包括以下(相关的)属性:
-- -----------------------------------------------------
-- Table `someDB`.`Models`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `someDB`.`Models` (
`model_id` MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT,
`type_id` SMALLINT UNSIGNED NOT NULL,
-- someOtherAttributes
PRIMARY KEY (`model_id`),
ENGINE = InnoDB;
+---------+---------+
| model_id| type_id |
+---------+---------+
| 1 | 4 |
| 2 | 4 |
| 3 | 5 |
| 4 | 3 |
+---------+---------+
还有一个表 Model_Hierarchy
,它显示了父子关系(仅显示相关属性):
-- -----------------------------------------------------
-- Table `someDB`.`Model_Hierarchy`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `someDB`.`Model_Hierarchy` (
`parent_id` MEDIUMINT UNSIGNED NOT NULL,
`child_id` MEDIUMINT UNSIGNED NOT NULL,
-- someOtherAttributes,
INDEX `fk_Model_Hierarchy_Models1_idx` (`parent_id` ASC),
INDEX `fk_Model_Hierarchy_Models2_idx` (`child_id` ASC),
PRIMARY KEY (`parent_id`, `child_id`),
CONSTRAINT `fk_Model_Hierarchy_Models1`
FOREIGN KEY (`parent_id`)
REFERENCES `someDB`.`Models` (`model_id`)
ON DELETE CASCADE
ON UPDATE NO ACTION,
CONSTRAINT `fk_Model_Hierarchy_Models2`
FOREIGN KEY (`child_id`)
REFERENCES `someDB`.`Models` (`model_id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
+-----------+----------+
| parent_id | child_id |
+-----------+----------+
| 1 | 2 |
| 2 | 4 |
| 3 | 4 |
+-----------+----------+
如果存在Model不是另一个类型为5的Model的父或子级(在某个时刻),则该模型无效,因此应将其删除。
这意味着Model 1,2应该被删除,因为在任何时候都没有将它们作为父或子级与type_id = 5的模型相关联。
此层次结构中有N个级别,但没有循环关系(即1->2; 2->1的情况不存在)。
如何实现呢?有什么想法吗?
a->b
表示a
是b
的父母,那么c->b
也是什么呢?对我来说,它应该是一个具有id
主键和parent_id
列的自连接层次结构。无论如何,是否允许使用alter table在Model_Hierarchy
上添加2个列,每个表中有多少行,最大深度是多少? - Drewparent_id
和child_id
都指向Models
表中的model_id
- 它们是FK(元组组合是Model_Hierarchy
的PK)。type_id
在任何情况下都不会显示在Model_Hierarchy
中。更好地理解,type_id 5
指的是“真正可销售的产品”,因此,如果一个model
不包含任何可销售的产品(即包装)或者model
的父级在某个时候不是可销售的产品(即一些未使用的子组件),那么我想删除它。我可以在FE中使用代码来完成这个任务,但比起在BE中完成,速度会慢得多。 - emihir0Models
中的每个model
,如果该model
不包含(或者不被)另一个type_id
为5
的model
所包含,则删除它”。这种“包含/被包含”的关系可以在Model_Hierarchy
表中找到。 - emihir0