Ben dişli yorum için iyi bir uyum olup olmadığını görmek için bir PostgreSQL contrib modülü olan ltree strong> ile oynamak oldum. Sen yolunu depolayan tabloda bir sütun oluşturmak ve bunun üzerine bir ltree dizin oluşturmak .. Daha sonra bu gibi sorguları gerçekleştirebilirsiniz:
ltreetest=# select path from test where path ~ '*.Astronomy.*';
path
-----------------------------------------------
Top.Science.Astronomy
Top.Science.Astronomy.Astrophysics
Top.Science.Astronomy.Cosmology
Top.Collections.Pictures.Astronomy
Top.Collections.Pictures.Astronomy.Stars
Top.Collections.Pictures.Astronomy.Galaxies
Top.Collections.Pictures.Astronomy.Astronauts
Ben bu ekler, güncelleştirmeleri veya silmeleri gibi şeyler ile ne kadar iyi performans belirlemek için yeterli onunla çevresinde oynanır değil. Ben bir silme gibi görünecektir varsayalım:
DELETE FROM test WHERE path ~ '*.Astronomy.*';
Ben bir dişli comment tablo gibi görünebilir, düşünüyorum:
CREATE SEQUENCE comment_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 78616
CACHE 1;
CREATE TABLE comments (
comment_id int PRIMARY KEY,
path ltree,
comment text
);
CREATE INDEX comments_path_idx ON comments USING gist (path);
: Bir ekleme kabaca (ve denenmemiş-ly) gibi görünecektir
CREATE FUNCTION busted_add_comment(text the_comment, int parent_comment_id) RETURNS void AS
$BODY$
DECLARE
INT _new_comment_id; -- our new comment_id
TEXT _parent_path; -- the parent path
BEGIN
_new_comment_id := nextval('comment_id_seq'::regclass);
SELECT path INTO _parent_path FROM comments WHERE comment_id = parent_comment_id;
-- this is probably busted SQL, but you get the idea... this comment's path looks like
-- the.parent.path.US
--
-- eg (if parent_comment_id was 5 and our new comment_id is 43):
-- 3.5.43
INSERT INTO comments (comment_id, comment, path) VALUES (_new_comment_id, the_comment, CONCAT(_parent_path, '.', _new_comment_id));
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Ya da bir şey. Temelde yolu sadece tüm birincil anahtarlar oluşan bir hiyerarşi olduğunu.