标准化数据模型
标准化数据模型
标准化被定义为减少或消除数据集中冗余的过程。
它已成为关系数据库中数据建模的事实上的方法,很大程度上是由于这些系统最初设计时所围绕的底层资源限制:缓慢的磁盘和昂贵的 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版本问题解决 终…...
编写可扩展的软件:架构和设计原则
在今天的软件开发领域,可扩展性是一个至关重要的概念。无论您是开发一个小型应用程序还是一个大规模的软件系统,都需要考虑如何使您的软件能够在不断变化的需求下进行扩展和演进。本文将探讨编写可扩展软件的关键架构和设计原则,以帮助开发人…...
算法-排序算法
0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序:不通过比较来决定元素间…...
Android_Monkey_测试执行策略及标准
一、Monkey命令概述 NO命令说明用法解释1 -p ALLOWED_PACKAGE用于指定某个apk,可以使用多个-p选项,但是每个-p命令选项只能用于一个apk 如果不指定-p,Monkey就会默认进行全系统测试。 -p com.android.contacts可以进行特定apk的Monkey测试2 …...
windows安装nginx
官网提供的下载地址:nginx: download nginx1.25.2下载地址:http://nginx.org/download/nginx-1.25.2.zip 直接运行nginx.exe会闪退,我们还得使用cmd/git bash/power shell 命令进行启动; 个人更喜欢git bash; 运行命…...
Java日期的学习篇
关于日期的学习 目录 关于日期的学习JDK8以前的APIDate Date常用APIDate的API应用 SimpleDateFormatSimpleDateFormat常用API测试 反向格式化(逆操作)测试 训练案例需求(秒杀活动)实现 Calendar需求痛点常见API应用测试 JDK8及以后的API(修改与新增)为啥学习(推荐使用)新增的AP…...
spark on hive
需要提前搭建好hive,并对hive进行配置。 1、将hive的配置文件添加到spark的目录下 cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf2、开启hive的hivemetastore服务 提前创建好启动日志存放路径 mkdir $HIVE_HOME/logStart nohup /usr/local/lib/apache-hi…...
Linux Vi编辑器基础操作指南
Linux Vi编辑器基础操作指南 Linux中的Vi是一个强大的文本编辑器,虽然它有一些陡峭的学习曲线,但一旦掌握了基本操作,它就变得非常高效。以下是Vi编辑器的一些基本用法: 打开Vi编辑器: vi 文件名退出Vi编辑器ÿ…...
WEB3 创建React前端Dapp环境并整合solidity项目,融合项目结构便捷前端拿取合约 Abi
好 各位 经过我们上文 WEB3 solidity 带着大家编写测试代码 操作订单 创建/取消/填充操作 我们自己写了一个测试订单业务的脚本 没想到运行的还挺好的 那么 今天开始 我们就可以开始操作我们前端 Dapp 的一个操作了 在整个过程中 确实是没有我们后端的操作 或者说 我们自己就…...
rust运算
不同类型不能放在一起运算。如果非要计算,必须先强转成一个类型再运算。 一 、数字运算 (一)算术运算 a 10且b 5 名称运算符范例加ab的结果为15减-a-b的结果为5乘*a*b的结果为50除/a / b的结果为2求余%a % b的结果为0 Rust语言不支持自增…...
游戏引擎,脚本管理模块
编辑器中删除脚本,然后立即恢复删除的脚本关系正常编辑器中删除脚本,关掉编辑器,然后只恢复脚本,不恢复meta,然后再打开编辑器关系丢失编辑器中删除脚本,关掉编辑器,然后恢复脚本且恢复meta,然后再打开编辑…...
阿里云的wordpress建站/长沙官网seo
BMM150数字地磁传感器 BMM150是一款低功耗,低噪声的3轴数字地磁传感器,可用于罗盘应用。 占地面积为1.56 x 1.56mm和高度为0.60 mm的12引脚晶圆级芯片级封装(WLCSP)为移动设备开发人员提供了最大的设计灵活性。 在手机,平板电脑或便携式媒体播放器等移动设备上进行虚拟现…...
动态图形设计/抖音seo公司
案例引入 用户和用户组正确使用所有工具都是有用的,并且“ 用户故事”也没有什么不同。 在小项目小团队使用时所在的球队处于同一位置,并可轻松获得客户的用户故事是太棒了 。 在以下任何一种情况下,用户故事都可能很快崩溃: 团…...
广州做网站价格/太原网站制作优化seo公司
在线QQ客服:1922638专业的SQL Server、MySQL数据库同步软件p13390677_112040_MSWIN-x86-64_1of7.zipp13390677_112040_MSWIN-x86-64_2of7.zipInstantclient_12_2.rar发送到邮箱以获得电子邮件的电子邮件电子邮件内容:Oracle 11g(电子邮件:1206157433qq.com)注意:解压…...
财经网站直播系统建设/电商运营转行后悔了
1- 汇编指令是机器指令的助记符, 同机器指令一一对应. 2- 每种CPU都有自己的汇编指令集 3- CPU直接使用的信息,在存储器中存放 4- 在存储器中得指令和数据没有区别,都是以二进制信息 5- 存储单元从0开始顺序编号 6- 一个存储单元可以存储8个bit,即8位2进制数 7- 1B 8b 1KB 10…...
汝州市文明建设门户网站/深圳做网站seo
离散型分子容器已用于催化,药物输送,化学传感等领域。特别是金属有机分子笼,因其具有可调节的主客体化学特性,合成方法简单,可刺激响应转换等特点而得到了广泛的应用。此外,氢键相互作用被广泛用于分子识别…...
服装公司网站网页设计/搜狗官网
前几天ubuntu崩溃,无奈重装系统。接着就装chrome。 1、在 http://www.google.com/chrome/eula.html 上下载chrome基于ubuntu的deb包。 2、先尝试直接安装,命令为:sudo dpkg -i google-chrome-stable_current_i386.deb(替换为下…...