0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

数据库中的schema

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-06-07 09:17 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

schema 一词起源于希腊语中的 formfigure,但具体应该如何定义 schema 取决于应用环境的上下文。schema 有不同的类型,其含义与数据科学、教育、营销和 SEO 以及心理学等领域密切相关。

在维基百科中将 schema 解释为,图式,在心理学中主要描述一种思维或行为类型,用来组织资讯的类别,以及资讯之间的关系。它也可以被描述为先入为主思想的心理结构,表示世界某些观点的框架,或是用于组织和感知新资讯的系统。

但在计算机中的 schema 其实与这个解释很接近了,从很多地方都可以看到schema这个名词,例如 database,openldap,programing language 等的。这里可以简单的把 _schema_理解为元数据集合(metadata component),主要包含元素及属性的声明,与其他数据结构组成。

数据库中的 schema

在数据库中,schema就像一个骨架结构,代表整个数据库的逻辑视图。它设计了应用于特定数据库中数据的所有约束。当在数据建模时,就会产生一个 schema。在谈到关系数据库]和面向对象数据库时经常使用 schema。有时也指将结构或文本的描述。

数据库中 schema 描述数据的形状以及它与其他模型、表和库之间的关系。在这种情况下,数据库条目是 schema 的一个实例,包含 schema 中描述的所有属性。

数据库 schema 通常分为两类:定义数据文件实际存储方式的物理数据库 schema 逻辑数据库 schema,它描述了应用于存储数据的所有逻辑约束,包括完整性、表和视图。常见包括

  • 星型模式(star schema)
  • 雪花模式(snowflake schema)
  • 事实星座模型(fact constellation schema 或 galaxy schema)

星型模式是类似于一个简单的数据仓库图,包括一对多的事实表和维度表。它使用非规范化数据。

ac8f944a-e59d-11ec-ba43-dac502259ad0.png

雪花模式是更为复杂的一种流行的数据库模式,在该模式下,维度表是规范化的,可以节省存储空间并最大限度地减少数据冗余。

事实星座模式远比星型模式和雪花模式复杂得多。它拥有多个共享多个维度表的事实表。

acc2ca7c-e59d-11ec-ba43-dac502259ad0.png

Kubernetes 中的 schema

通过上面的阐述,大概上可以明白 schema 究竟是什么东西了,在 Kubernetes 中也有 schema 的概念,通过对 kubernetes 中资源(GVK)的规范定义、相互关系间的映射等,schema 即 k8s 资源对象元数据。

而 kubernetes 中资源对象即GroupVersionKind这些被定义在staging/src/k8s.io/api/type.go 中,即平时所操作的 yaml 文件,例如

apiVersion:apps/v1
kind:Deployment
metadata:
name:ngx
namespace:default
spec:
selector:
matchLabels:
app:ngx
template:
metadata:
labels:
app:nginx
spec:
containers:
-name:ngx-schema
image:nginx
ports:
-containerPort:80
ad338618-e59d-11ec-ba43-dac502259ad0.png

而对应的的即为 TypeMetaObjectMetaDeploymentSpecTypeMetakindapiserverObjectMetaNameNamespaceCreationTimestamp 等段。

DeploymentSpec则对应了 yaml 中的 spec。

而整个 yaml 组成了 一个 k8s 的资源对象。

typeDeploymentstruct{
metav1.TypeMeta`json:",inline"`
//Standardobjectmetadata.
//+optional
metav1.ObjectMeta`json:"metadata,omitempty"protobuf:"bytes,1,opt,name=metadata"`

//SpecificationofthedesiredbehavioroftheDeployment.
//+optional
SpecDeploymentSpec`json:"spec,omitempty"protobuf:"bytes,2,opt,name=spec"`

//MostrecentlyobservedstatusoftheDeployment.
//+optional
StatusDeploymentStatus`json:"status,omitempty"protobuf:"bytes,3,opt,name=status"`
}

register.go则是将对应的资源类型注册到 schema 中的类

var(
//TODO:moveSchemeBuilderwithzz_generated.deepcopy.gotok8s.io/api.
//localSchemeBuilderandAddToSchemewillstayink8s.io/kubernetes.
SchemeBuilder=runtime.NewSchemeBuilder(addKnownTypes)
localSchemeBuilder=&SchemeBuilder
AddToScheme=localSchemeBuilder.AddToScheme
)

//Addsthelistofknowntypestothegivenscheme.
funcaddKnownTypes(scheme*runtime.Scheme)error{
scheme.AddKnownTypes(SchemeGroupVersion,
&Deployment{},
&DeploymentList{},
&StatefulSet{},
&StatefulSetList{},
&DaemonSet{},
&DaemonSetList{},
&ReplicaSet{},
&ReplicaSetList{},
&ControllerRevision{},
&ControllerRevisionList{},
)
metav1.AddToGroupVersion(scheme,SchemeGroupVersion)
returnnil
}

apimachinery包则是 schema 的实现,通过看其内容可以发现,kubernetes 中 schema 就是GVK的属性约束 与GVR之间的映射。

通过示例了解 schema

例如在apps/v1/deployment这个资源,在代码中表示k8s.io/api/apps/v1/types.go,如果需要对其资源进行扩展那么需要怎么做?如,建立一个StateDeplyment资源

typeDeploymentstruct{
metav1.TypeMeta`json:",inline"`
//Standardobjectmetadata.
//+optional
metav1.ObjectMeta`json:"metadata,omitempty"protobuf:"bytes,1,opt,name=metadata"`

如上述代码所示,Deployment 中的metav1.TypeMetametav1.ObjectMeta

ad810abe-e59d-11ec-ba43-dac502259ad0.png

那么我们复制一个 Deployment 为 StateDeployment,注意,因为 Deployment 的两个属性,metav1.TypeMetametav1.ObjectMeta分别实现了不同的方法,如图所示

adc895a0-e59d-11ec-ba43-dac502259ad0.png

所以在实现方法时,需要实现DeepCopyinfoDeepCopy和继承接口ObjectDeepCopyObject方法

//DeepCopyIntoisanautogenerateddeepcopyfunction,copyingthereceiver,writingintoout.inmustbenon-nil.
func(in*StateDeployment)DeepCopyInto(out*StateDeployment){
*out=*in
out.TypeMeta=in.TypeMeta
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
in.Spec.DeepCopyInto(&out.Spec)
in.Status.DeepCopyInto(&out.Status)
return
}

//DeepCopyisanautogenerateddeepcopyfunction,copyingthereceiver,creatinganewStateDeployment.
func(in*StateDeployment)DeepCopy()*StateDeployment{
ifin==nil{
returnnil
}
out:=new(StateDeployment)
in.DeepCopyInto(out)
returnout
}

//DeepCopyObjectisanautogenerateddeepcopyfunction,copyingthereceiver,creatinganewruntime.Object.
func(in*StateDeployment)DeepCopyObject()runtime.Object{
ifc:=in.DeepCopy();c!=nil{
returnc
}
returnnil
}

那么扩展一个资源的整个流为:

  • 资源类型在:k8s.io/api/{Group}/types.go
  • 资料类型的实现接口k8s.io/apimachinery/pkg/runtime/interfaces.go.Object
  • 其中是基于Deployment的类型,metav1.TypeMetametav1.ObjectMeta
  • metav1.TypeMeta实现了GetObjectKind()metav1.ObjectMeta实现了 DeepCopyinfo=()DeepCopy(),还需要实现DeepCopyObject()
  • 最后注册资源到 schema 中k8s.io/api/apps/v1/register.go

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • API
    API
    +关注

    关注

    2

    文章

    2147

    浏览量

    66212
  • 数据库
    +关注

    关注

    7

    文章

    3993

    浏览量

    67727

原文标题:理解 Kubernetes 的 API Schema

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    数据库数据恢复—服务器异常断电导致Oracle数据库故障的数据恢复案例

    Oracle数据库故障: 某公司一台服务器上部署Oracle数据库。服务器意外断电导致数据库报错,报错内容为“system01.dbf需要更多的恢复来保持一致性”。该Oracle数据库
    的头像 发表于 07-24 11:12 435次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—服务器异常断电导致Oracle<b class='flag-5'>数据库</b>故障的<b class='flag-5'>数据</b>恢复案例

    数据库数据恢复—MongoDB数据库文件丢失的数据恢复案例

    MongoDB数据库数据恢复环境: 一台操作系统为Windows Server的虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 工作人员在MongoDB服务仍
    的头像 发表于 07-01 11:13 455次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—MongoDB<b class='flag-5'>数据库</b>文件丢失的<b class='flag-5'>数据</b>恢复案例

    数据库数据恢复—SQL Server数据库被加密如何恢复数据

    SQL Server数据库故障: SQL Server数据库被加密,无法使用。 数据库MDF、LDF、log日志文件名字被篡改。
    的头像 发表于 06-25 13:54 499次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—SQL Server<b class='flag-5'>数据库</b>被加密如何恢复<b class='flag-5'>数据</b>?

    SQLSERVER数据库是什么

    支持在Linux和容器化环境运行。 核心特点 关系型数据库 基于SQL(结构化查询语言)进行数据操作,支持表、行、列等结构化存储。 提供ACID(原子性、一致性、隔离性、持久性)事务支持,确保
    的头像 发表于 05-26 09:19 979次阅读

    MySQL数据库是什么

    开发、企业应用和大数据场景。以下是其核心特性和应用场景的详细说明: 核心特性 关系型数据库模型 数据以 表(Table) 形式组织,表由行(记录)和列(字段)构成。 通过 主键、外键 实现表间关联,支持复杂查询和事务处理。 示例
    的头像 发表于 05-23 09:18 913次阅读

    HarmonyOS5云服务技术分享--云数据库使用指南

    ? 华为云数据库(CloudDB)在HarmonyOS的使用指南 ? ​​嗨,开发者朋友们!​​ 今天咱们来聊聊华为云数据库(CloudDB)在HarmonyOS应用的集成和使用技
    发表于 05-22 18:29

    数据库数据恢复——MongoDB数据库文件拷贝后服务无法启动的数据恢复

    MongoDB数据库数据恢复环境: 一台Windows Server操作系统虚拟机上部署MongoDB数据库。 MongoDB数据库故障: 管理员在未关闭MongoDB服务的
    的头像 发表于 04-09 11:34 648次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复——MongoDB<b class='flag-5'>数据库</b>文件拷贝后服务无法启动的<b class='flag-5'>数据</b>恢复

    数据库数据恢复—SQL Server附加数据库提示“错误 823”的数据恢复案例

    SQL Server数据库附加数据库过程中比较常见的报错是“错误 823”,附加数据库失败。 如果数据库有备份则只需还原备份即可。但是如果没有备份,备份时间太久,或者其他原因导致备份
    的头像 发表于 02-28 11:38 819次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—SQL Server附加<b class='flag-5'>数据库</b>提示“错误 823”的<b class='flag-5'>数据</b>恢复案例

    分布式云化数据库有哪些类型

    分布式云化数据库有哪些类型?分布式云化数据库主要类型包括:关系型分布式数据库、非关系型分布式数据库、新SQL分布式数据库、以列方式存储
    的头像 发表于 01-15 09:43 863次阅读

    MySQL数据库的安装

    MySQL数据库的安装 【一】各种数据库的端口 MySQL :3306 Redis :6379 MongoDB :27017 Django :8000 flask :5000 【二】MySQL 介绍
    的头像 发表于 01-14 11:25 857次阅读
    MySQL<b class='flag-5'>数据库</b>的安装

    数据库是哪种数据库类型?

    数据库是一种部署在虚拟计算环境数据库,它融合了云计算的弹性和可扩展性,为用户提供高效、灵活的数据库服务。云数据库主要分为两大类:关系型
    的头像 发表于 01-07 10:22 793次阅读

    数据库加密办法

    企业对于数据的重视程度不言而喻,也衍生出了数据=资产的概念。但是数据泄漏的事件频繁发生,为了保护数据资产,企业有必要对数据库做一些针对性的措
    的头像 发表于 12-24 09:47 1000次阅读

    数据库数据恢复—Mysql数据库表记录丢失的数据恢复流程

    Mysql数据库故障: Mysql数据库表记录丢失。 Mysql数据库故障表现: 1、Mysql数据库无任何
    的头像 发表于 12-16 11:05 997次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—Mysql<b class='flag-5'>数据库</b>表记录丢失的<b class='flag-5'>数据</b>恢复流程

    数据库事件触发的设置和应用

    数据库无论对于生产管理还是很多的实际应用都非常重要。小编这次聊一下数据库事件触发的应用。示例使用了postgresql和Python。
    的头像 发表于 12-13 15:14 1018次阅读

    数据库数据恢复—MYSQL数据库ibdata1文件损坏的数据恢复案例

    mysql数据库故障: mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库
    的头像 发表于 12-09 11:05 1045次阅读