当前位置: 首页 > news >正文

标准化数据模型

标准化数据模型

标准化被定义为减少或消除数据集中冗余的过程。

它已成为关系数据库中数据建模的事实上的方法,很大程度上是由于这些系统最初设计时所围绕的底层资源限制:缓慢的磁盘和昂贵的 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】求一个字符串的长度(指针)

代码 使用指针来遍历字符串&#xff0c;直到遇到字符串结尾的空字符\0为止&#xff0c;统计字符数量即为字符串长度。 #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))

哈希表的基本概念 哈希表是一种数据结构&#xff0c;用于存储键值对。它的核心思想是将键通过哈希函数转化为索引&#xff0c;然后将值存储在该索引位置的数据结构中。 哈希函数的作用 哈希函数是哈希表的关键部分。它将输入&#xff08;键&#xff09;映射到哈希表的索引位…...

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 安装包&#xff1a;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 ΔP0​P1​P2​&#xff0c;它的外接圆是 O O O&#xff0c;设 O O O的半径是 R R R。同时&#xff0c;设 Δ …...

常见的软件脱壳思路

单步跟踪法 1.本方法采用OD载入。 2.跟踪F8&#xff0c;实现向下的跳。 3.遇到程序回跳按F4。 4.绿色线条表示跳转没实现&#xff0c;不用理会&#xff0c;红色线条表示跳转已经实现&#xff01; 5.刚载入程序有一个CALL的&#xff0c;我们就F7跟进去&#xff0c;不然程序很容…...

Python:torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解

Python&#xff1a;torch.nn.Conv1d(), torch.nn.Conv2d()和torch.nn.Conv3d()函数理解 1. 函数参数 在torch中的卷积操作有三个&#xff0c;torch.nn.Conv1d(),torch.nn.Conv2d()还有torch.nn.Conv3d(),这是搭建网络过程中常用的网络层&#xff0c;为了用好卷积层&#xff0…...

scala 连接 MySQL 数据库案例

1 依赖准备 mysql 8添加&#xff1a; <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency> mysql 5 添加&#xff1a; <dependency><grou…...

guava工具类常用方法

Guava是Google开发的一个Java开源工具类库&#xff0c;它提供了许多实用的工具类和功能&#xff0c;可以简化Java编程中的常见任务。 引入依赖 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>2…...

CSShas伪类选择器案例附注释

<!DOCTYPE html> <html lang="en"> <head><meta charset...

nodejs+vue中医体质的社区居民健康管理系统elementui

可以实现首页、中医体质量表、健康文章、健康视频、我的等&#xff0c;在我的页面可以对医生、小区单元、医疗药品等功能进行操作。目前主要的健康管理系统是以西医为主&#xff0c;而为了传扬中医文化&#xff0c;提高全民健康意识&#xff0c;解决人民日益增长的美好生活需要…...

Kotlin中reified 关键字

前言 在开始之前&#xff0c;让我们先讨论一下泛型。泛型用于为类、函数或接口提供通用的实现。下面是一个示例泛型方法&#xff1a; fun <T> displayValue(value: T) {println(value) }fun main() {displayValue<String>("Generics")displayValue<…...

Linux命令(95)之alias

linux命令之alias 1.alias介绍 linux命令alias是用来将/bin目录下的命令进行别名设置&#xff0c;将一些较长的命令进行简化。 alias命令的作用只局限于该次登入的操作&#xff0c;相当于临时变量。 如果对当前用户永久生效&#xff0c;需修改~/.bashrc文件&#xff0c;使用…...

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 安装完毕&#xff0c;终端输入pip list检查 导入模块出现bug&#xff0c;发现不是matplotlib包的问题&#xff0c;pycharm版本貌似不兼容&#xff0c;用python编辑器可正常绘图&#xff0c;pygame也可正常导入。 ​​​​​​​ pycharm版本问题解决 终…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义&#xff08;Task Definition&…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

为什么要创建 Vue 实例

核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...