标准化数据模型
标准化数据模型
标准化被定义为减少或消除数据集中冗余的过程。
它已成为关系数据库中数据建模的事实上的方法,很大程度上是由于这些系统最初设计时所围绕的底层资源限制:缓慢的磁盘和昂贵的 RAM。更少的数据冗余/重复意味着更有效地从磁盘读取数据并占用更少的空间。甚至一些像 Cassandra 这样的 NoSQL 数据库也鼓励采用非常标准化的方法来存储数据。
规范化通常需要创建一系列表,每个表可以有一组不同的字段,但给定表中的每条记录必须为其所有字段都有一个值 - 不多也不少。任何具有相当复杂的数据模型的应用程序最终都会将该数据分割到 10 个(如果不是 100 个甚至 1000 个)表中。在这些表中,数据通过“关系”链接在一起(即,表 1 中存储的记录包含到表 2 中记录的链接)。这些表、字段和关系就是所谓的“模式”。
标准化数据确实提供了一些好处:
- 重复数据删除:存储给定值一次并从多个位置引用它可以节省存储空间。
- 一致性:同样,更新仅存储在一个位置并从其他位置引用的值意味着更新可以应用一次并且不存在不一致。
- 数据完整性:规范化通常与数据库仅接受与正确字段(有时甚至是这些字段的数据类型)匹配的传入数据的能力相关。然而,我认为,虽然这是一项有益的功能,但它并不是直接源于规范化数据模型,而是源于底层实现。
然而,它也有一些缺点:
- 当数据进入系统时,必须将其划分到这些众多的表中,并且确保所有内容一起更新(即事务和关系完整性)可能会占用大量资源。
- 当应用程序请求多个数据点时,需要复杂(即慢速)JOIN 将多个表中的值拼凑在一起。
- 表中的所有记录必须相同,这使得存储不同结构的数据非常具有挑战性(几乎不可能)。引入与当前模型不同格式的数据需要新表,并且从一种结构更改为另一种结构可能需要大量停机时间。
- 阻抗不匹配:现代应用程序处理数据(即对象)的方式与在数据库中存储或检索数据的方式非常不同。
非规范化数据模型
另一方面,我们有非规范化,这是一种通常用于通过将类似数据分组在一起来提高性能的策略。历史上,数据被非规范化,通过避免跨表的复杂 JOIN 的需要来提高数据仓库中的报告性能。这带来了在多个模型中保持数据最新的额外挑战,但我们将在另一天再讨论脆弱的 ETL 管道。
在一些现代(即NoSQL)数据库中,非规范化被吹捧为解决关系数据库挑战的灵丹妙药。开发人员被告知要对一切进行非规范化,以便获得现代 Web 和移动应用程序所需的灵活性和性能。对于简单的数据模型,这很容易做到并且确实提供了显着的好处。然而,对于更复杂的数据模型,它实际上会使开发变得更加困难。
非规范化的好处是:
- 减少阻抗失配(对于简单应用)
- 模式从一个记录到另一个记录的轻松变化
- 通过一次性插入所有相关数据并删除跨表的 JOIN 进行检索,提高了性能。
然而,它也有权衡:
- 数据重复:相同的值在整个数据库中多次重复,增加了存储和处理要求。
- 数据不一致:数据重复意味着更新一个值需要在多个位置更改该值。由于这通常无法一次全部完成(或至少不能大规模完成),因此在进行更新时结果不一致
- 难以对复杂关系进行建模,实际上增加了企业应用程序的阻抗失配。复杂应用程序的多个组件都需要在不同时间以不同方式操作相同的数据。强迫他们在一个记录中合作(或竞争)实际上是不可能的。
讽刺的是,正如由于 RAM 和磁盘的限制而开发规范化数据模型一样,非规范化的建议也是从一些早期 NoSQL 技术的缺陷出发:不支持跨表的高效 JOIN,缺乏强一致性(即使在单个记录上)以允许记录之间的引用。
混合标准化/非标准化数据模型
Couchbase 的一个非常强大的方面是它支持多种混合规范化和非规范化数据类型。通过 JSON 可以轻松实现非规范化,而通过支持 JOIN 和强一致性可以轻松实现规范化……并且两者可以并存。
- 完全规范化的数据模型可以在多个订单中实现良好的重复数据删除。然而,在系统上线后为每个客户添加第二个(或第三个、第四个等)地址字段将是相当具有挑战性的。或者也许只为某些产品而不是其他产品添加评论。
- 另一方面,完全非规范化的数据模型使得一个客户拥有 1 个地址而另一个客户拥有 2 个地址变得非常容易。但是,在所有订单中更新产品描述可能会非常密集(即缓慢)并导致两个根据查询数据库的时间,对同一产品有不同的描述。它还会导致客户详细信息以及产品名称和描述的大量重复,从而需要更多的资源来存储、处理、备份等。
使用 Couchbase,可以在同一模式中同时拥有规范化和非规范化数据模型。这些数据在有意义的地方进行标准化:使用订单到产品和客户的参考来避免任何数据重复或不一致。它还在有意义的地方进行了非规范化:将所有客户数据保存在一个记录中,并允许不同的客户拥有不同的信息。它甚至是同一记录中两者的混合:虽然订单引用产品和客户,但它们还包含该订单中包含的任意项目列表。这很有道理。
只有当使用的数据库不仅能够支持强一致性,而且还能够具有强大的查询语言来表达数据记录之间的复杂关系时,这才有可能实现。
相关文章:
标准化数据模型
标准化数据模型 标准化被定义为减少或消除数据集中冗余的过程。 它已成为关系数据库中数据建模的事实上的方法,很大程度上是由于这些系统最初设计时所围绕的底层资源限制:缓慢的磁盘和昂贵的 RAM。更少的数据冗余/重复意味着更有效地从磁盘读取数据并占…...
linux平台源码编译ffmpeg
目录 编译平台 编译步骤 编译平台 中标麒麟 编译步骤 1 从Download FFmpeg 下载源码,我选中了4.2.9版 2 解压 3 在解压后的目录下输入 ./configure --enable-shared --prefix/usr/local/ffmpeg 4 make 5 sudo make install 6 ffmpeg的头文件、可执行程…...

Vue中如何进行拖拽与排序功能实现
在Vue中实现拖拽与排序功能 在Web应用程序中,实现拖拽和排序功能是非常常见的需求,特别是在管理界面、任务列表和图形用户界面等方面。Vue.js作为一个流行的JavaScript框架,提供了许多工具和库来简化拖拽和排序功能的实现。本文将介绍如何使…...

新款UI动态壁纸头像潮图小程序源码
新款UI动态壁纸头像潮图小程序源码,不需要域名服务器,直接添加合法域名,上传发布就能使用。 可以对接开通流量主,个人也能运营,不需要服务器源码完整。整合头像,动态壁纸,文案功能齐全。 源码…...

Python逐日填补Excel中的日期并用0值填充缺失日期的数据
本文介绍基于Python语言,读取一个不同的列表示不同的日期的.csv格式文件,将其中缺失的日期数值加以填补;并用0值对这些缺失日期对应的数据加以填充的方法。 首先,我们明确一下本文的需求。现在有一个.csv格式文件,其第…...

【C语言经典100例题-70】求一个字符串的长度(指针)
代码 使用指针来遍历字符串,直到遇到字符串结尾的空字符\0为止,统计字符数量即为字符串长度。 #include<stdio.h> #define n 20 int getlength(char *a) {int len 0;while(*a!\0){len;a;}return len; } int main() {char *arr[n] { 0 };int l…...

十天学完基础数据结构-第八天(哈希表(Hash Table))
哈希表的基本概念 哈希表是一种数据结构,用于存储键值对。它的核心思想是将键通过哈希函数转化为索引,然后将值存储在该索引位置的数据结构中。 哈希函数的作用 哈希函数是哈希表的关键部分。它将输入(键)映射到哈希表的索引位…...
flink集群部署
虚拟机配置 bigdata-hmaster 192.168.135.112 4核心 32GB bigdata-hnode1 192.168.135.113 4核心 16GB bigdata-hnode2 192.168.135.114 4核心 16GB 安装包:https://dlcdn.apache.org/flink/flink-1.17.1/flink-1.17.1-bin-scala_2.12.tgz 放到/usr/lcoal/lib目录…...
2.证明 非单一点 Oct.2023
目录 原题解引申出的编程问题非单一点题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 题解题目正解 原题 已知等边 Δ P 0 P 1 P 2 \Delta P_0P_1P_2 ΔP0P1P2,它的外接圆是 O O O,设 O O O的半径是 R R R。同时,设 Δ …...

常见的软件脱壳思路
单步跟踪法 1.本方法采用OD载入。 2.跟踪F8,实现向下的跳。 3.遇到程序回跳按F4。 4.绿色线条表示跳转没实现,不用理会,红色线条表示跳转已经实现! 5.刚载入程序有一个CALL的,我们就F7跟进去,不然程序很容…...
Python:torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解
Python:torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解 1. 函数参数 在torch中的卷积操作有三个,torch.nn.Conv1d(),torch.nn.Conv2d()还有torch.nn.Conv3d(),这是搭建网络过程中常用的网络层,为了用好卷积层࿰…...
scala 连接 MySQL 数据库案例
1 依赖准备 mysql 8添加: <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency> mysql 5 添加: <dependency><grou…...
guava工具类常用方法
Guava是Google开发的一个Java开源工具类库,它提供了许多实用的工具类和功能,可以简化Java编程中的常见任务。 引入依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>2…...
CSShas伪类选择器案例附注释
<!DOCTYPE html> <html lang="en"> <head><meta charset...

nodejs+vue中医体质的社区居民健康管理系统elementui
可以实现首页、中医体质量表、健康文章、健康视频、我的等,在我的页面可以对医生、小区单元、医疗药品等功能进行操作。目前主要的健康管理系统是以西医为主,而为了传扬中医文化,提高全民健康意识,解决人民日益增长的美好生活需要…...
Kotlin中reified 关键字
前言 在开始之前,让我们先讨论一下泛型。泛型用于为类、函数或接口提供通用的实现。下面是一个示例泛型方法: fun <T> displayValue(value: T) {println(value) }fun main() {displayValue<String>("Generics")displayValue<…...
Linux命令(95)之alias
linux命令之alias 1.alias介绍 linux命令alias是用来将/bin目录下的命令进行别名设置,将一些较长的命令进行简化。 alias命令的作用只局限于该次登入的操作,相当于临时变量。 如果对当前用户永久生效,需修改~/.bashrc文件,使用…...

DHCPsnooping 配置实验(2)
DHCP报文泛洪攻击 限制接收到报文的速率 vlan 视图或者接口视图 dhcp request/ dhcp-rate dhcp snooping check dhcp-request enable dhcp snooping alarm dhcp-request enable dhcp snooping alarm dhcp-request threshold 1 超过则丢弃报文 查看[Huawei]dis dhcp statistic…...

Qt 综合练习小项目--反金币(2/2)
目录 4 选择关卡场景 4.2 背景设置 4.3 创建返回按钮 4.3 返回按钮 4.4 创建选择关卡按钮 4.5 创建翻金币场景 5 翻金币场景 5.1 场景基本设置 5.2 背景设置 5.3 返回按钮 5.4 显示当前关卡 5.5 创建金币背景图片 5.6 创建金币类 5.6.1 创建金币类 MyCoin 5.6.…...

安装matplotlib__pygame,以pycharm调入模块
安装pip 安装matplotlib 安装完毕,终端输入pip list检查 导入模块出现bug,发现不是matplotlib包的问题,pycharm版本貌似不兼容,用python编辑器可正常绘图,pygame也可正常导入。 pycharm版本问题解决 终…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

从0开始学习R语言--Day17--Cox回归
Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…...