{"id":212847,"date":"2014-02-17T15:05:04","date_gmt":"2014-02-17T11:05:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=212847"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=212847","title":{"rendered":"<span class=\"post_title\">\u0414\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u044c\u0435\u0432<\/span>"},"content":{"rendered":"<div class=\"content html_format\">   \t\u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0434\u0435\u0440\u0435\u0432\u043e. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u044b, \u0432 \u0441\u0442\u0440\u0430\u043d\u0430\u0445 \u2014 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445 \u2014 \u0433\u043e\u0440\u043e\u0434\u0430, \u0432 \u0433\u043e\u0440\u043e\u0434\u0430\u0445 \u2014 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u2014 \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a\u0438, \u0442\u043e\u0432\u0430\u0440\u044b \u0438\u043b\u0438 \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0435\u0449\u0451. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e. \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430. \u041d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0451 <b>object<\/b>:<\/p>\n<pre><code class=\"sql\">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 ); <\/code><\/pre>\n<p>  \u041d\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0435\u0451 \u043a\u0430\u043a\u0438\u043c\u0438-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<pre><code class=\"bash\">id  |  parent_id  |  type     |  name ------------------------------------------------------ 1   |  NULL       |  country  |  \u0420\u043e\u0441\u0441\u0438\u044f 2   |  1          |  region   |  \u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c 3   |  1          |  region   |  \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c 4   |  2          |  city     |  \u041c\u043e\u0441\u043a\u0432\u0430 5   |  3          |  city     |  \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043e\u0434\u043d\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0441\u0432\u044f\u0437\u0438:<\/p>\n<pre><code class=\"sql\">-- \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0433\u043e\u0440\u043e\u0434\u0430 \u0420\u043e\u0441\u0441\u0438\u0438 SELECT *   FROM object     WHERE type = 'city'     START WITH id = 1 CONNECT BY PRIOR id = parent_id;  -- \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a SELECT *   FROM object     WHERE type = 'country'     START WITH id = 5 CONNECT BY PRIOR parent_id = id; <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u043e\u0433\u043e, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0443\u0442\u044b \u0434\u0432\u0435, \u0430 \u0442\u043e \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u041c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u0437\u0434\u043d\u043e\u0432\u0430\u0442\u043e\u2026 \u0422\u0443\u0442-\u0442\u043e \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0442\u0430\u043a\u043e\u0439 \u0434\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<br \/>  <a name=\"habracut\"><\/a><br \/>  \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u044f\u0437\u0438 \u0432 \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0432\u0438\u0434\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0430\u043a\u0435\u0442 <b>objects<\/b> \u0441 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439 <b>get_object_fast_table<\/b>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0430\u043c \u0434\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0432\u044f\u0437\u0438:<\/p>\n<pre><code class=\"sql\">CREATE OR REPLACE PACKAGE objects AS        TYPE object_fast_type     IS RECORD (       object_id object.id%TYPE,       object_name object.name%TYPE,       object_type object.type%TYPE,       parent_id object.id%TYPE,       parent_name object.name%TYPE,       parent_type object.type%TYPE,       nesting_level NUMBER(20)     );    TYPE object_fast_table     IS TABLE OF objects.object_fast_type;      FUNCTION get_object_fast_table     RETURN objects.object_fast_table PIPELINED;      END objects; \/  CREATE OR REPLACE PACKAGE BODY objects AS    FUNCTION get_object_fast_table     RETURN objects.object_fast_table PIPELINED IS      CURSOR objs IS       SELECT id         FROM object;          CURSOR parents(obid object.id%TYPE) IS       SELECT         obid  object_id,         obj.name object_name,         obj.type object_type,         par.id parent_id,         par.name parent_name,         par.type parent_type,         level - 1 nesting_level       FROM object par       LEFT JOIN object obj ON obj.id = obid          START WITH par.id = obid  CONNECT BY PRIOR par.parent_id = par.id;    BEGIN      FOR obj IN objs LOOP       FOR object_fast IN parents(obj.id) LOOP         PIPE ROW (object_fast);       END LOOP;     END LOOP;      RETURN;   END get_object_fast_table;  END objects; \/  <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u0437\u0430\u043f\u0440\u043e\u0441\u0430\u0445:<\/p>\n<pre><code class=\"sql\">SELECT * FROM TABLE(objects.get_object_fast_table()); <\/code><\/pre>\n<pre><code class=\"bash\">object_id | object_name           | object_type | parent_id |  parent_name           | parent_type | nesting_level ------------------------------------------------------------------------------------------------------------------ 1         | \u0420\u043e\u0441\u0441\u0438\u044f                | country     | 1         |  \u0420\u043e\u0441\u0441\u0438\u044f                | country     | 0 2         | \u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c    | region      | 2         |  \u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c    | region      | 0 2         | \u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c    | region      | 1         |  \u0420\u043e\u0441\u0441\u0438\u044f                | country     | 1 3         | \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c | region      | 3         |  \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c | region      | 0 3         | \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c | region      | 1         |  \u0420\u043e\u0441\u0441\u0438\u044f                | country     | 1 4         | \u041c\u043e\u0441\u043a\u0432\u0430                | city        | 4         |  \u041c\u043e\u0441\u043a\u0432\u0430                | city        | 0 4         | \u041c\u043e\u0441\u043a\u0432\u0430                | city        | 2         |  \u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c    | region      | 1 4         | \u041c\u043e\u0441\u043a\u0432\u0430                | city        | 1         |  \u0420\u043e\u0441\u0441\u0438\u044f                | country     | 2 5         | \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a           | city        | 5         |  \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a           | city        | 0 5         | \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a           | city        | 3         |  \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c | region      | 1 5         | \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a           | city        | 1         |  \u0420\u043e\u0441\u0441\u0438\u044f                | country     | 2 <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0435\u0441\u0442\u044c \u0441\u0432\u044f\u0437\u0438 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0435\u0433\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f\u043c\u0438, \u0430 nesting_level \u2014 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e \u0443\u0440\u043e\u0432\u043d\u0435\u0439 \u0434\u043e \u0440\u043e\u0434\u0438\u0442\u0435\u043b\u044f. \u0427\u0442\u043e\u0431 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043d\u0435 \u0434\u0451\u0440\u0433\u0430\u0442\u044c \u044d\u0442\u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0441\u0432\u044f\u0437\u0438 \u0432 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"sql\">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, objs.* FROM TABLE(objects.get_object_fast_table()) objs;  ALTER TABLE object_fast ADD CONSTRAINT pk_object_fast PRIMARY KEY (id); <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0448\u0435\u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"sql\">-- \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0433\u043e\u0440\u043e\u0434\u0430 \u0420\u043e\u0441\u0441\u0438\u0438 SELECT *   FROM object_fast     WHERE parent_id = 1 AND object_type = 'city';  -- \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a SELECT *   FROM object_fast     WHERE object_id = 5 AND parent_type = 'country'; <\/code><\/pre>\n<p>  \u041d\u0443 \u0438, \u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e, \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0434\u0435\u043a\u0441\u044b:<\/p>\n<pre><code class=\"sql\">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); <\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451. \u041e\u0442 \u0441\u0435\u0431\u044f \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0434\u0430\u043b \u043f\u0440\u0438\u0440\u043e\u0441\u0442 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0432 60 \u0440\u0430\u0437. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441 \u0443\u043c\u043e\u043c \u0438 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043f\u043e\u0441\u043e\u0431 \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0440\u0435\u0434\u043a\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u0438 \u0443\u0434\u0430\u043b\u044f\u044e\u0449\u0438\u043c\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430\u043c. \u041d\u0443 \u0438\u043b\u0438 \u0442\u043e\u0433\u0434\u0430 \u0441\u0442\u043e\u0438\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u041d\u0435\u0442 \u043f\u0440\u0435\u0434\u0435\u043b\u0430 \u043f\u043e\u043b\u0451\u0442\u0443 \u0444\u0430\u043d\u0442\u0430\u0437\u0438\u0438\u2026    \t<\/p>\n<div class=\"clear\"><\/div>\n<\/p><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/212847\/\"> http:\/\/habrahabr.ru\/post\/212847\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"content html_format\">   \t\u041e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e \u0437\u0430 \u043e\u0441\u043d\u043e\u0432\u0443 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u0435\u0440\u0451\u0442\u0441\u044f \u0434\u0435\u0440\u0435\u0432\u043e. \u041f\u0440\u043e\u0441\u0442\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440: \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u044b, \u0432 \u0441\u0442\u0440\u0430\u043d\u0430\u0445 \u2014 \u043e\u0431\u043b\u0430\u0441\u0442\u0438, \u0432 \u043e\u0431\u043b\u0430\u0441\u0442\u044f\u0445 \u2014 \u0433\u043e\u0440\u043e\u0434\u0430, \u0432 \u0433\u043e\u0440\u043e\u0434\u0430\u0445 \u2014 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438, \u0432 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f\u0445 \u2014 \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a\u0438, \u0442\u043e\u0432\u0430\u0440\u044b \u0438\u043b\u0438 \u0447\u0442\u043e-\u043b\u0438\u0431\u043e \u0435\u0449\u0451. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u0435\u0440\u0435\u0432\u0430 \u0432\u043f\u043e\u043b\u043d\u0435 \u043b\u043e\u0433\u0438\u0447\u043d\u043e \u0438 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e. \u0418\u0435\u0440\u0430\u0440\u0445\u0438\u0447\u043d\u043e\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u0430\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u0430\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430. \u041d\u0430\u0437\u043e\u0432\u0451\u043c \u0435\u0451 <b>object<\/b>:<\/p>\n<pre><code class=\"sql\">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 ); <\/code><\/pre>\n<p>  \u041d\u0430\u043f\u043e\u043b\u043d\u0438\u043c \u0435\u0451 \u043a\u0430\u043a\u0438\u043c\u0438-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u0430\u043d\u043d\u044b\u043c\u0438:<\/p>\n<pre><code class=\"bash\">id  |  parent_id  |  type     |  name ------------------------------------------------------ 1   |  NULL       |  country  |  \u0420\u043e\u0441\u0441\u0438\u044f 2   |  1          |  region   |  \u041c\u043e\u0441\u043a\u043e\u0432\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c 3   |  1          |  region   |  \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a\u0430\u044f \u043e\u0431\u043b\u0430\u0441\u0442\u044c 4   |  2          |  city     |  \u041c\u043e\u0441\u043a\u0432\u0430 5   |  3          |  city     |  \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u044d\u0442\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043b\u0435\u0433\u043a\u043e \u043e\u0434\u043d\u0438\u043c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u043c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0435 \u043d\u0430\u043c \u0441\u0432\u044f\u0437\u0438:<\/p>\n<pre><code class=\"sql\">-- \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u0433\u043e\u0440\u043e\u0434\u0430 \u0420\u043e\u0441\u0441\u0438\u0438 SELECT *   FROM object     WHERE type = 'city'     START WITH id = 1 CONNECT BY PRIOR id = parent_id;  -- \u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0443, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u041d\u043e\u0432\u043e\u0441\u0438\u0431\u0438\u0440\u0441\u043a SELECT *   FROM object     WHERE type = 'country'     START WITH id = 5 CONNECT BY PRIOR parent_id = id; <\/code><\/pre>\n<p>  \u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u043e\u0433\u043e, \u0447\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0437\u0430\u043f\u0440\u043e\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0438\u043d\u0443\u0442\u044b \u0434\u0432\u0435, \u0430 \u0442\u043e \u0438 \u0431\u043e\u043b\u044c\u0448\u0435. \u041c\u0435\u043d\u044f\u0442\u044c \u0432\u0441\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u043a-\u0442\u043e \u043f\u043e\u0437\u0434\u043d\u043e\u0432\u0430\u0442\u043e\u2026 \u0422\u0443\u0442-\u0442\u043e \u043d\u0430\u043c \u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0438 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u0440\u0435\u0432\u0430. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e\u0431 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0442\u0430\u043a\u043e\u0439 \u0434\u0435\u043d\u043e\u0440\u043c\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-212847","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/212847","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=212847"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/212847\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=212847"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=212847"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=212847"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}