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.mzph.cn/news/125697.shtml

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

相关文章

Vue 的双向数据绑定是如何实现的?

目录 1. 响应式数据 2. v-model 指令 3. 实现原理 4. 总结 Vue.js 是一款流行的前端 JavaScript 框架,它以其强大的双向数据绑定能力而闻名。双向数据绑定使得数据在视图和模型之间保持同步,并且任一方的变化都会自动反映到另一方。那么,…

2021-arxiv-GPT Understands, Too

2021-arxiv-GPT Understands, Too Paper: https://arxiv.org/abs/2103.10385 Code: https://github.com/THUDM/P-tuning Prompt 简单理解 举例来讲,今天如果有这样两句评论: 1. 什么苹果啊,都没有苹果味&#xff0c…

rust std

目录 一,std基本数据结构 1,std::option 2,std::result 二,std容器 1,vector 三,std算法 1,排序 2,二分 (1)vector二分 (2)…

【C++代码】分割等和子集,目标和,一和零,零钱兑换,动态规划--代码随想录

题目&#xff1a;分割等和子集 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 初步想法排序后双指针&#xff0c;发现不行 class Solution { public:bool canPartition(vector<int>&…

计讯物联外贸公司--佰沃恩应邀出席第三届“嘉庚论坛”—科技创新推动经济高质量发展分论坛

10月22日&#xff0c;以“数智创新能动未来”为主题的第三届“嘉庚论坛”—科技创新推动经济高质量发展分论坛于集美海景皇冠假日酒店正式启幕。此论坛聚焦集美区战略前沿产业&#xff0c;汇聚来自全国各地优秀的企业家、高校及科研院所专家学者&#xff0c;并邀请相关领域的亲…

【案例实战】NodeJS+Vue3+MySQL实现列表查询功能

这篇文章&#xff0c;给大家带来一个列表查询的功能&#xff0c;从前端到后端的一个综合案例实战。 采用vue3作为前端开发&#xff0c;nodejs作为后端开发。 首先我们先来看一下完成的页面效果。点击分页&#xff0c;可以切换到上一页、下一页。搜索框可以进行模糊查询。 后端…

CSRF 篇

一、CSRF 漏洞&#xff1a; 1、漏洞概述&#xff1a; &#xff08;1&#xff09;一般情景&#xff1a; 利用已认证用户的身份执行未经用户授权的操作。攻击者试图欺骗用户在其不知情的情况下执行某些操作&#xff0c;通常是在受害者已经登录到特定网站的情况下。 &#xff0…

长沙某公司面经总结 - 失败版

1.Java语言的特征 Java的三大特性&#xff1a;封装、继承、多态 面向对象是利于语言对现实事物进行抽象。面向对象具有以下特征&#xff1a; 继承&#xff1a;继承是从已有类得到继承信息创建新类的过程 封装&#xff1a;封装是把数据和操作数据的方法绑定起来&#xff0c;对…

IP地址与代理ip在网络安全中的关键作用

目录 前言 一、IP地址在网络安全中的作用 1、网络流量监视和分析 2、网络安全事件响应 3、网络安全检测和防御 二、代理IP在网络安全中的作用 1、流量过滤和清洗 2、匿名访问和保护隐私 3、实现全球化业务 三、IP地址和代理IP在网络安全中的应用案例 1、DDoS攻击 2…

QT实现在线流媒体播放平台

文章目录 QT实现在线流媒体播放平台简介开发视频ffmpeg下载SimpleVideoPlayer.hSimpleVideoPlayer.cpp 开发音频添加功能打开文件夹播放暂停播放上下一首选择倍速 效果展示项目下载 QT实现在线流媒体播放平台 简介 Qt是一种流行的C开发框架&#xff0c;它提供了用于构建图形用…

AT32固件库外设使用,ArduinoAPI接口移植,模块化

目录 一、ArduinoAPI移植一、通用定时器使用1.计时1.2.ETR外部时钟计数4.ArduinoAPI - timer 三、ADC1.ADC初始化&#xff08;非DMA&#xff09;2.ADC_DMA 规则通道扫描 六、USB HID IAP1.准备好Bootloader和app2.配置好时钟&#xff0c;一定要打开USB3.将生成的时钟配置复制到…

Mybatis执行流程简析

一、前言 日常工作中&#xff0c;我们用到mybatis的时候&#xff0c;都是写一个Mapper接口xml文件/注解形式&#xff0c;然后就可以在业务层去调用我们在Mapper接口中定义的CRUD方法&#xff0c;很方便&#xff0c;但一直都没有去研究过执行逻辑&#xff0c;下面附一篇我自己研…

使用simple_3dviz进行三维模型投影

【版权声明】 本文为博主原创文章&#xff0c;未经博主允许严禁转载&#xff0c;我们会定期进行侵权检索。 更多算法总结请关注我的博客&#xff1a;https://blog.csdn.net/suiyingy&#xff0c;或”乐乐感知学堂“公众号。 本文章来自于专栏《Python三维模型处理基础》的系列文…

飞鹅打印机使用注意事项:打印小票(云播报打印机)FP-V58-W(c)

文章目录 引言I 基础操作1.1 设置Wi-Fi1.2 在机器内预先内置logo 引言 应用场景&#xff1a; 云播报打印机&#xff1a;支持第三方软件开发商&#xff0c;接单后实现智能语音播报&#xff0c;可播报订单信息、打印订单小票。 http://www.feieyun.com/open/index.html 飞鹅对…

Android OpenGL ES 2.0入门实践

本文既然是入门实践&#xff0c;就先从简单的2D图形开始&#xff0c;首先&#xff0c;参考两篇官方文档搭建个框架&#xff0c;便于写OpenGL ES相关的代码&#xff1a;构建 OpenGL ES 环境、OpenGL ES 2.0 及更高版本中的投影和相机视图。 先上代码&#xff0c;代码效果如下图…

WPF自定义控件库之Window窗口

在WPF开发中&#xff0c;默认控件的样式常常无法满足实际的应用需求&#xff0c;我们通常都会采用引入第三方控件库的方式来美化UI&#xff0c;使得应用软件的设计风格更加统一。常用的WPF的UI控件库主要有以下几种&#xff0c;如&#xff1a;Modern UI for WPF&#xff0c;Mat…

Elasticsearch:使用 Elasticsearch 进行词汇和语义搜索

作者&#xff1a;PRISCILLA PARODI 在这篇博文中&#xff0c;你将探索使用 Elasticsearch 检索信息的各种方法&#xff0c;特别关注文本&#xff1a;词汇 (lexical) 和语义搜索 (semantic search)。 使用 Elasticsearch 进行词汇和语义搜索 搜索是根据你的搜索查询或组合查询…

0基础学习PyFlink——使用DataStream进行字数统计

大纲 sourceMapSplittingMapping ReduceKeyingReducing 完整代码结构参考资料 在《0基础学习PyFlink——模拟Hadoop流程》一文中&#xff0c;我们看到Hadoop在处理大数据时的MapReduce过程。 本节介绍的DataStream API&#xff0c;则使用了类似的结构。 source 为了方便&…

C# Onnx 用于边缘检测的轻量级密集卷积神经网络LDC

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;namespace Onnx…