PostGreSQL:数据表继承

news2024/11/26 14:50:26

        PostGreSQL手册的简史部分介绍到:被称为PostGreSQL的对象关系型数据库管理系统,由美国加州大学伯克利 分校编写的POSTGRES软件包发展而来。经过十几年的发展,PostGreSQL目前是世界上最先进的开源数据库。

The object-relational database management system now known as PostgreSQL is derived from the POSTGRES package written at the University of California at Berkeley. With decades of development behind it, PostgreSQL is now the most advanced open-source database available anywhere.

         不同于传统的关系型数据库,对象关系型数据库(ORDBMS),是面向对象技术与传统关系数据库结合的产物。它基于面向对象编程(OOP)的基本思想,将所有的实体都看成是对象,通过深入分析对象之间的继承、关联关系,将对象进行封装,转换成数据表,并提供了一种“表继承”的机制,来帮助数据库设计者更方便的完成数据库的设计。

表继承

案例引入

假设:目前要为一个城市city建立数据模型,而城市分为两类:省会城市和非省会城市;要求能够快速检索任何特定省份的省会城市。

        我们当然可以创建一张表,并使用一个额外的字段来标识这个城市是否为该省份的省会,但问题在于会造成严重的数据冗余。因为:34个省份中,非首都城市的数量要远远大于首都城市的数量。

CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int     -− in feet,
    province_id     int,
    is_capital      boolean
);

        于是我们尝试创建两张表,一个用来存储省会城市,另一个用来存储非省会城市的数据(PS:)。但是又会提升维护的复杂度,因为两张表的结构相同,但是却定义了两次,从数据库设计者的角度来讲,这种情况是极其糟心的。

CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int     -− in feet,
    province_id     int,
);

CREATE TABLE capitals (
    name            text,
    population      float,
    altitude        int     -− in feet,
    province_id     int
) INHERITS (cities);

表继承

        有没有一种折中的办法,就像Java中的面向对象机制-继承特性一样,来减少重复字段的定义呢?答案是有的:因为PostgreSQL实现了表继承,这对数据库设计者来说是一种有用的工具。像下面这样,

---创建数据表
CREATE TABLE myschema.cities (
    name            text,
    population      float,
    altitude        int,
    province        varchar(64)
);

--创建继承子表
CREATE TABLE myschema.capitals (
) INHERITS (myschema.cities);

        在这种情况下,capitals继承了它的父表cities的所有列。我们只需要将所有的省会城市存储到capitals中,而不用考虑其它的问题,因为继承特性帮助我们完成了表结构的复用。

cities表结构

 

capitals表结构

如何查询被继承的表

        在PostgreSQL中,一个表可以从0个或者多个其他表继承,而对一个表的查询则可以引用一个表的所有行或者该表的所有行加上它所有的后代表默认情况是后一种

          我们分别向cities父级表、capitals子级表中添加几条测试数据,

--添加数据
INSERT INTO myschema.cities(name,population,altitude,province) 
VALUES ('洛阳',125,500,'河南省'),
('平顶山',100,600,'河南省'),
('焦作',180,550,'河南省')



---为继承子表添加数据
INSERT INTO myschema.capitals(name,population,altitude,province) 
VALUES ('郑州市',125,500,'河南省')


SELECT name,population,altitude,province FROM myschema.cities

        查询结果默认包含:父级表和继承子表中的所有记录,

        上面的查询操作等同于:

SELECT name,population,altitude,province 
FROM myschema.cities*

        其中: *显式指定包括所有后代表,这也是PG数据库的默认行为。

如何仅查询父级表

        PostGreSQL数据库提供了ONLY关键字,用于:表明该查询应该只针对cities父级表,而不包括其后代。

        PS:其它命令(SELECT, UPDATE 和 DELETE)都支持ONLY关键字。

SELECT name,population,altitude,province FROM ONLY myschema.cities

        如下所示,这次的查询结果仅仅是cities中的记录,

如何判断结果行属于哪一张表

        现在,我们可能存在疑惑:假如我们查询了一张父级表,那么,我们如何知晓结果中的每一行来自于父级表还是子级表呢?

        PostGreSQL数据库的设计者显然也考虑到了这个问题:在每个表里我们都有一个tableoid 系统属性可以告诉你源表是谁,

SELECT name,population,altitude,province,tableoid
FROM myschema.cities*

        查询结果如下,

        通过tableoid字段,我们可以对记录进行分类。那么如何通过tableoid字段拿到具体的表名称呢?只需要通过和pg_class做一个连接,就可以看到实际的表名字

--和pg_class表做连接查询
SELECT name,population,altitude,province,pg_class.relname
FROM myschema.cities* LEFT JOIN  pg_class 
        ON pg_class.oid = myschema.cities.tableoid

 

其它使用细节

①所有父表的检查约束和非空约束都会自动被所有子表继承。 不过其它类型的约束(唯一、主键、外键约束)不会被继承。

②一个子表可以从多个父表继承,这种情况下它将拥有所有父表字段的总和, 并且子表中定义的字段也会加入其中。

③任何存在子表的父表都不能被删除,同样,子表中任何从父表继承的字段或约束也不能被删除或修改。 如果你想删除一个表及其所有后代,最简单的办法是使用CASCADE选项删除父表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1146860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

编程应用场景:便利店商超进销存管理系统软件,试用版可以免费试用下载

编程应用场景:便利店商超进销存管理系统软件,试用版可以免费试用下载 软件特色: 1、功能实用,操作简单,不会电脑也会操作,软件免安装,已内置数据库。软件在关闭的时候,可以设置会员…

Power BI 傻瓜入门 16. 深入挖掘DAX

本章内容包括: 实施高级DAX编码实践使用DAX度量扩展公式使用Power BI应用DAX编码和调试的最佳实践 在第14章和第15章中,我将讨论DAX的ABC。在这些章节中,提到了创建公式的步骤,这样您就可以创建更复杂的计算,以帮助为…

服务网格介绍

服务网格定义 轻量级的网络代理应该无感知应用之间的流量由服务器网格接管服务间的调用可能出现的超时 ,重试,监控,追踪等工作下沉到服务网格层处理 ● 如下图所示:深色代表应用,青灰色代表网络中轻量级的网络代理.代理之间可以相互通信,而应用之间的通信完全由代理来进行,如…

【MATLAB】安装Psychtoolbox

目录 一、下载Psychtoolbox工具包 1. 一个是这个ZTP文件 2. 分别下载 Subversion 1.7.x command-line client 和 gstreamer.freedesktop.org 二、解压工具包,保存至同一文件 三、安装到matlab 1. 安装psychtoolbox 2. 检查是否安装成功 一、下载Psychtoolbox…

【MATLAB源码-第60期】OFDM通信链路仿真包含卷积编码,交织,QPSK调制,子载波和CP以及多径数目可自行设置。

操作环境: MATLAB 2022a 1、算法描述 %% 仿真过程 % 产生0-1随机序列 >(交织)> 符号映射 > 串并转换 > 插入导频 % > IFFT变换 > 加循环前缀CP > 并串转换 > (信道编码) > 多径信道% …

openpnp - 汇川伺服和冰沙主板的连接

文章目录 openpnp - 汇川伺服和冰沙主板的连接概述笔记X轴伺服X轴步进电机X伺服 - 电源进线X轴伺服 - 步进控制线X轴步进电机 - 步进控制线X轴伺服 - 编码器反馈线X轴步进电机 - 编码器反馈线X伺服 - 主板端来的控制信号线主板端 - 主板端来的控制信号线X伺服控制信号线 - 主板…

用过的三种常用步进电机驱动电路

一、DRV8255 电流调节需要调整电位器,输入PWM、方向及使能信号即可控制,价格相对比较便宜 二、TB6600 调整细分数及电流即可驱动,驱动电流较大,接口电路光耦隔离 三、TMC2660 相对成本较高,可实现半流锁止、半流启动…

win10虚拟机安装教程

目录 1、安装VMware 10、12、16都可以,看个人选择 2、开始安装系统(以vm16为例) 3、在虚拟机中安装win10 完成 1、安装VMware 10、12、16都可以,看个人选择 下面链是我虚拟机安装包,需要可以下载。 YR云盘 软件安…

SpreadJS 16.2.2 + GcExcel 6.2.3 相结合,还有更强的吗

SpreadJS GcExcel 相结合,还有更强的吗? 内容摘自互联网,,, 设计思路篇 Excel是我们日常办公中最常用的电子表格程序,不仅可满足报表数据的计算需求,还可提供绘图、数据透视分析、BI和Visual…

宿华辞任快手董事长;小米澎湃OS开启“人车家全生态”;Hugging Face 被限制访问;朝鲜开发者被指控冒名从事美企远程外包

人工智能公司 Hugging Face 发言人在上周五的一封电子邮件中写道:“中国的人工智能社区非常出色,我们希望他们能更好地访问 HF,但目前我们对于政府的法规无能为力。” 一、商业圈 1.小米新品发布会定档 10月26日。雷军发文:以人…

IOC课程整理-8 Spring Bean作用域

1 Spring Bean作用域 2" singleton " Bean作用域 3" prototype " Bean作用域 • 注意事项 • Spring 容器没有办法管理 prototype Bean 的完整生命周期,也没有办法记录实例的存在。销毁回调方法将不会执行,可以利用 BeanPostProces…

阿里二面:双亲委派机制?原理?能打破吗?

最近收到粉丝私信,大厂面试常问:“什么是双亲委派机制?类加载过程怎样?优缺点是什么?原理是何?能打破双亲委派机制吗?如何打破?有哪些场景使用?” 故借此简单总结一下&a…

python安装库

查看安装的库 按下开始r 输入cmd 查看python版本 查看python所有库 安装一个库 在pycharm里面查看库文件 在pycharm里面安装库 在anaconda里面安装库和查看库

Java练习题 2022 -4

皖北流行一种叫做“干瞪眼”的扑克牌游戏,使用的扑克牌牌面数值包括:A(1),2,3,4,5,6,7,8,9,T(10),J(11),Q(12),K(13)。这里10用T替换,暂时不考虑大鬼和小鬼。 两手牌的大小规则如下(暂不考虑其他规则): a…

阿里云服务器—ECS快速入门

这里对标阿里云的课程,一步步学习,链接在下面,学习完考试及格即可获取阿里云开发认证和领取证书,大家可以看看这个,这里我当作笔记,记一下提升印象! 内容很长,请耐心看完&#xff0…

视频特效制作软件 After Effects 2023 mac中文版介绍说明

After Effects 2023 mac是一款专业视频特效和动态图形设计软件。ae2023被广泛应用于电影、电视节目、广告和网络媒体等领域,可以创建各种令人惊叹的视觉效果。 在After Effects 2023中,用户可以使用强大的工具和功能来制作复杂的特效和动画。新版本引入了…

EASYX动画效果实现

eg1:绘制小球的动画效果 通过一下的代码实现小球从左向右移动效果&#xff0c;计算小球的移动速度和帧率实现移动效果平和造成视觉上的错觉 #include <stdio.h> #include <easyx.h> #include <iostream> #include <math.h> #define PI 3.14 // 1PI …

Word批量删除文档属性和个人信息方法图解

投标文件中设计敏感信息&#xff0c;在投标前必须删除&#xff0c;Word批量删除文档属性和个人信息方法图解&#xff1a; 右键word文件属性--详细信息&#xff0c;可以查看如下信息&#xff1b; 删除上述信息的办法&#xff1a; 1.打开word文件---文件 2.检查文档、检查文档 检…

Kubernetes的hostpath创建pv和pvc的验证---以部署halo博客系统为例

结论&#xff1a;hostapath作为一种存储类型是支持使用pv及pvc声明使用的。 缘由&#xff1a;最近在寻求云计算方向的运维管理岗位&#xff0c;周五晚上参加了一个头部大厂的西安岗位电面&#xff0c;面试人似乎不情愿作为本场考评的面试官&#xff0c;我在电子会议等了大约17分…