PostGreSQL:数据表继承

        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.rhkb.cn/news/176087.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++】string类

STL STL(standard template libaray-标准模板库):是C标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。 为什么学习string类? 1、C语言中的字符串 C语言中,字符串是以\0结尾…

计组之存储系统

存储器概述 分类 1.按在计算机中的作用(层次)分类 主存储器。CPU可以直接随机地对其进行访问,也可以和高速缓冲存储器(Cache)及辅助存储器交换数据。辅助存储器。辅存的内容需要调入主存后才能被CPU访问。高速缓冲存储器。位于…

SSM咖啡点餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 咖啡点餐管理系统是一套完善的信息系统,结合SSM框架完成本系统,对理解JSP java编程开发语言有帮助系统采用SSM框架(MVC模式开发),系统具有完整的源代码和数据库,系统主 要采用B/S模式开…

Spring@Lazy是如何解决构造函数循环依赖问题

Spring实例化源码解析之循环依赖CircularReference这章的最后我们提了一个构造函数形成的循环依赖问题,本章就是讲解利用Lazy注解如何解决构造函数循环依赖和其原理。 准备工作 首先创建两个构造函数循环依赖的类,TestA和TestB,代码如下&am…

通用开源自动化测试框架 - Robot Framework

一、什么是 Robot Framework? 1. Robot Framework 的历史由来 Robot Framework是一种通用的自动化测试框架,最早由Pekka Klrck在2005年开发,并由Nokia Networks作为内部工具使用。后来,该项目以开源形式发布,并得到了…

Py之pypdf:pypdf的简介、安装、使用方法之详细攻略

Py之pypdf:pypdf的简介、安装、使用方法之详细攻略 目录 pypdf的简介 pypdf的安装 pypdf的使用方法 1、基础用法 pypdf的简介 pypdf是一个免费的、开源的纯python PDF库,能够拆分、合并、裁剪和转换PDF文件的页面。它还可以为PDF文件添加自定义数据…

喜讯!合合信息顺利通过CMMI3级评估

近日,在擎标顾问团的咨询辅导下,上海合合信息科技股份有限公司(简称“合合信息”)顺利通过了CMMI3级评估。CMMI是国际上最流行、最实用的一种软件生产过程标准和软件企业成熟度等级认证的标准,通过该认证表明企业在开发…

CS224W1.1——图机器学习介绍

文章目录 1. 介绍2. 主要问题3. 深度学习如何应用在图结构中4. 课程大纲 学习一下斯坦福CS224W的图机器学习(2021年),并做一下学习笔记,主要是研究方向与图神经网络相关。这次是第一次笔记,图片很多都是从斯坦福的PPT里…

Flask基本教程以及Jinjia2模板引擎简介

flask基本使用 直接看代码吧,非常容易上手: # 创建flask应用 app Flask(__name__)# 路由 app.route("/index", methods[GET]) def index():return "FLASK:欢迎访问主页!"if __name__ "__main__"…

Flask 路由机制分析之一

一、前言 《Flask Run运行机制剖析》这篇我们讲了应用启动的内部机制,启动后就开始监听Http请求了,请求过来如何跳到对应的函数执行,这就是路由机制。我们沿用上一篇例子,来探究一下app.route("/")内部干了些什么事。 …

VDA到Excel方案介绍之自定义邮件接收主题

VDA标准是德国汽车工业协会(Verband der Automobilindustrie,简称VDA)制定的一系列汽车行业标准。这些标准包括了汽车生产、质量管理、供应链管理、环境保护、安全性能等方面的规范和指南。VDA标准通常被德国和国际上的汽车制造商采用&#x…

【算法-数组1】二分查找 和 移除元素

今天,带来XXX的讲解。文中不足错漏之处望请斧正! 理论基础 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标&#…

yum 命令

基本语法 yum [选项] [参数] 选项说明 -y 对所有提问都回答“yes” 参数说明 实操 yum list | grep firefox yum -y remove firefox yum -y install firefox

使用MobaXterm向linux窗口化传输文件

使用MobaXterm向linux窗口化传输文件 之前上大学的时候,经常是XSheel配合Xftp使用,Xftp可以窗口化的往linux服务器传输文件,但是有一个问题,就是Xftp是收费的。 后来工作之后师兄给推荐了一个免费的,又好用的类似于Xf…

uni-app/vue 文字转语音朗读(附小程序语音识别和朗读)uniapp小程序使用文字转语音播报类似支付宝收款播报小程序语音识别和朗读)

uni-app/vue 文字转语音朗读(小程序语音识别和朗读) uniapp小程序功能集合 1、uniapp小程序文字转语音播报 一、第一种方式:直接加语音包 固定的文本 先利用工具生成了 文本语音mp3文件,放入项目中,直接用就好了 …

【CSS】position

CSS position 1.静态布局 static static 是 position 属性的默认值,表示没有定位。使用静态定位的元素会按照元素正常的位置显示,并且不会受到 top、bottom、left、right 和 z-index 属性的影响。 2.相对定位 relative 相对定位就是元素相对于自己默…

Spring Cloud 之RabbitMQ的学习【详细】

服务通信 分布式系统通信两种方式: 直接远程调用(同步)借助第三方间接通信(异步) 同步通讯的问题 Feign就属于同步通讯。存在的如下问题 耦合度高,每次添加新的模块就要修改原有模块的代码性能下降&am…

css(层叠样式表)

文章目录 一、CSS介绍二、CSS使用方式1. 行内样式/内联样式(单一页面中使用)设置背景颜色 background-color:green; 2. 内嵌样式(少量页面中使用)3. 外链样式表(项目中使用) 三、 样式表特征1. 层叠性2. 继…

学习redis之前的泛泛而谈(特性介绍,应用场景,Ubuntu安装与通用命令介绍)

文章目录 前言关于分布式系统Redis特性Redis应用场景Redis5安装redis命令最核心的两个命令:get和setkeysexitsdelexpirettlredis中key的过期策略type redis数据类型的内部实现方式redis的单线程 前言 redis最重要的概念:在内存中存储数据 为什么要设计一…

代购商城源码是否可以定制开发?

定制开发,符合个性需求 代购商城源码是现代电子商务中的重要工具,它为代购商提供了建立在线店铺、管理产品和订单、处理支付和物流等功能。然而,对于不同的代购商而言,在源码的基础上进行个性化定制开发无疑是提升竞争力和用户体验…