PostgreSQL中的分层结构

2021-06-26 00:27:51

它' s常见模式:启动时的数据库开发人员可能位于其公司工程团队的产品小组。在一家百货商店,鞋是一个衣服的子类别,而你最喜欢的热水瓶可能在旅游部门。

在任何GitHub组织中,团队中的团队中有团队。在任何大型百货商店,有些类别嵌套。在任何食谱书中,有很多方法可以对食物进行分类。

杰克(我的男朋友)和我一直在探索兴趣和纯粹的怪物的关系数据库概念。这是一个有趣的问题,我给了他,我们必须一起工作。我们想要分享很有趣!我们赢得了与PostgreSQL安装,安全,设置,Blah Blah在这时击败了灌木丛,让'刚刚有一些纯粹的数据库乐趣几分钟!

处理大量读取和少量写入小到中等量的键(在这种情况下,文本字段),每个键可能具有对父密钥的引用。

在这个具体的例子中,我们将复制团队结构。从一些小型组织内存的团队开始,每个团队都有一个名称,可能是父母:

对于此练习,路径的确切格式并不重要。 HTML字符串,逗号分隔的列表或任何有序集合是可接受的。

对于第一个解决方案,请确保'熟悉空,主键和外键的想法。我们' LL需要这些来建立队伍和父母之间的安全,有效的联系。

我们' ll然后使用物化视图来创建一种时间点小组结构的缓存。我们' ll使用在写入原始表时触发的函数刷新此功能。

对于下一个解决方案,我们' LL探索了可以解决我们的需要的量身定制的Ltree类型,而无需第一解决方案的复杂机制。此外,该解决方案提供了一些有用的功能,如子路径。

请确保您的数据库位于UTF-8中!我们今天将探索国际文本。如果您'重新确定,让' s创建一个新的空数据库,然后继续并连接到它。

创建表团队(名称文本唯一不是null主键,父文本引用团队(名称));创建物化视图team_structure与递归teams_cte(姓名,父,路径)一样(选择团队。名称,团队。父,父母,父母[团队) 。名称]来自团队的团队。父级是空联合所有选择团队。名称,团队。父,array_append(teams_cte。姓名)来自Teams_cte,团队团队的团队。父= teams_cte。名称)选择*来自teams_cte;创建函数refresh_team_structure()返回触发语言PLPGSQL AS $$开始刷新刷新物流化View Team_structure;回归新;结束; $$;在更新或插入或删除或截断或截断Coundsexecute过程refresh_team_structure()后创建触发器trigger_update_team_structure;

加载示例数据,包括几个复杂的案例,如空格,重音器和中文脚本:

插入团队(名称,父母)值('工程',null),('geschäftstätigkeit''工程'),('产品&#39 ;,'工程'),('实习生''产品'),('管理',null),('人力资源','管理'),('金融''行政'),('营销',null),( '物流',null),('国际化',null);

>解释分析Select * from Team_structure在哪里'产品' =任何(路径); SEQ扫描Team_structure(成本= 0. 00 .. 24. 63行= 3宽度= 96)(实际时间= 0。015 .. 0。016 Rows = 2 LOOPS = 1)过滤器:( '产品' :: text =任何(路径))筛选删除的行:8规划时间:0。 047 MSExecution时间:0。 026女士

如果您的PostgreSQL是正式分布式包,LTREE是一个扩展,您可能已经拥有了。 Ltree类型上的PostgreSQL文档非常汇总,所以Let'不只是重复它们,让'解决我们的问题!

标签是一系列字母数字字符和下划线(例如,在C语言环境中允许字符A-ZA-Z0-9_)。标签必须少于256个字节。

虽然长度限制并不可怕,但缺乏对完整的UTF-8谱的支持,例如空间甚至是工程或Geschäftstätigkeit等空间甚至单词真的是限制性的!

所以,当我们创建我们的表时,让' s给它一个名称列,我们可以存储任何我们想要的e̘̫̩̼͝x̢o̵̞͙̰͕t͈̼̺͍̥i̻͉̺͚͕c̶̥̘͖̪̤̜文本。我们' LL还需要一个包含在路径中的预期片段的块柱。

创建扩展如果不存在Ltree;创建表团队(名称文本不是null,slug text not null检查(slug〜*' ^ [a-za-z0-9 _] {1,255} $'),path ltree唯一不是null主键) ;

插入团队(名称,SLUG,PATH)值('工程''工程','工程'),('geschäftstätigkeit', '运营','工程。工程和#39;),('产品','产品''工程和#39; ),('实习生''实习生','工程。工程。interngrount.interns'),('行政','行政& #39;,'行政'),('人力资源'' human_resources','行政管理.human_resources'),(&#39 ;金融','金融','行政管理。金融和#39;),('营销''营销'营销'),('物流''物流','物流'),('国际化',&#39 ;国际化','国际化');

>解释分析从路径@&#39的团队中选择*;产品' ; SEQ扫描团队(成本= 0. 00 .. 18. 13行= 1宽= 96)(实际时间= 0。013 .. 0。014 Rows = 2 LOOPS = 1)过滤器:(路径@&#39 ;产品' :: ltxquery)筛选的行:8规划时间:0。 055 MSExecution时间:0。 029女士

如您所见,此问题可以以几种不同的方式解决此问题,其中一些基本的SQL概念一起使用,或者已经存在于现有类型! 不要让限制让你失望,你可以克服它们! 我希望这已经给了你一些关于你可以用数据库做的新事物的想法!