CREATE TABLE object ( id NUMBER(11), parent_id NUMBER(11), type VARCHAR2(16) NOT NULL, name VARCHAR2(255) NOT NULL, CONSTRAINT pk_object PRIMARY KEY (id), CONSTRAINT fk_object_parent FOREIGN KEY (parent_id) REFERENCES object (id) ON DELETE CASCADE ENABLE );
id | parent_id | type | name ------------------------------------------------------ 1 | NULL | country | 2 | 1 | region | 3 | 1 | region | 4 | 2 | city | 5 | 3 | city |
-- SELECT * FROM object WHERE type = 'city' START WITH id = 1 CONNECT BY PRIOR id = parent_id; -- , SELECT * FROM object WHERE type = 'country' START WITH id = 5 CONNECT BY PRIOR parent_id = id;
CREATE MATERIALIZED VIEW object_fast REFRESH COMPLETE ON DEMAND START WITH trunc(sysdate)+4/24 NEXT (trunc(sysdate)+1)+4/24 AS SELECT rownum id, tree.* FROM ( SELECT CONNECT_BY_ROOT id object_id, CONNECT_BY_ROOT name object_name, CONNECT_BY_ROOT type object_type, id parent_id, name parent_name, type parent_type, level-1 nesting_level FROM object CONNECT BY PRIOR parent_id = id ORDER BY object_id, nesting_level ) tree;; ALTER TABLE object_fast ADD CONSTRAINT pk_object_fast PRIMARY KEY (id);
id | object_id | object_name | object_type | parent_id | parent_name | parent_type | nesting_level ---------------------------------------------------------------------------------------------------------------------- 1 | 1 | | country | 1 | | country | 0 2 | 2 | | region | 2 | | region | 0 3 | 2 | | region | 1 | | country | 1 4 | 3 | | region | 3 | | region | 0 5 | 3 | | region | 1 | | country | 1 6 | 4 | | city | 4 | | city | 0 7 | 4 | | city | 2 | | region | 1 8 | 4 | | city | 1 | | country | 2 9 | 5 | | city | 5 | | city | 0 10 | 5 | | city | 3 | | region | 1 11 | 5 | | city | 1 | | country | 2
-- SELECT * FROM object_fast WHERE parent_id = 1 AND object_type = 'city'; -- , SELECT * FROM object_fast WHERE object_id = 5 AND parent_type = 'country';
CREATE INDEX object_fast_obj_id ON object_fast (object_id); CREATE INDEX object_fast_par_id ON object_fast (parent_id); CREATE INDEX object_fast_obj_type ON object_fast (object_type); CREATE INDEX object_fast_par_type ON object_fast (parent_type); CREATE INDEX object_fast_nesting ON object_fast (nesting_level);
Source: https://habr.com/ru/post/212847/
All Articles