标准化数据模型

标准化数据模型

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

它已成为关系数据库中数据建模的事实上的方法,很大程度上是由于这些系统最初设计时所围绕的底层资源限制:缓慢的磁盘和昂贵的 RAM。更少的数据冗余/重复意味着更有效地从磁盘读取数据并占用更少的空间。甚至一些像 Cassandra 这样的 NoSQL 数据库也鼓励采用非常标准化的方法来存储数据。

规范化通常需要创建一系列表,每个表可以有一组不同的字段,但给定表中的每条记录必须为其所有字段都有一个值 - 不多也不少。任何具有相当复杂的数据模型的应用程序最终都会将该数据分割到 10 个(如果不是 100 个甚至 1000 个)表中。在这些表中,数据通过“关系”链接在一起(即,表 1 中存储的记录包含到表 2 中记录的链接)。这些表、字段和关系就是所谓的“模式”。

标准化数据确实提供了一些好处:

  • 重复数据删除:存储给定值一次并从多个位置引用它可以节省存储空间。
  • 一致性:同样,更新仅存储在一个位置并从其他位置引用的值意味着更新可以应用一次并且不存在不一致。
  • 数据完整性:规范化通常与数据库仅接受与正确字段(有时甚至是这些字段的数据类型)匹配的传入数据的能力相关。然而,我认为,虽然这是一项有益的功能,但它并不是直接源于规范化数据模型,而是源于底层实现。

然而,它也有一些缺点:

  • 当数据进入系统时,必须将其划分到这些众多的表中,并且确保所有内容一起更新(即事务和关系完整性)可能会占用大量资源。
  • 当应用程序请求多个数据点时,需要复杂(即慢速)JOIN 将多个表中的值拼凑在一起。
  • 表中的所有记录必须相同,这使得存储不同结构的数据非常具有挑战性(几乎不可能)。引入与当前模型不同格式的数据需要新表,并且从一种结构更改为另一种结构可能需要大量停机时间。
  • 阻抗不匹配:现代应用程序处理数据(即对象)的方式与在数据库中存储或检索数据的方式非常不同。

非规范化数据模型

另一方面,我们有非规范化,这是一种通常用于通过将类似数据分组在一起来提高性能的策略。历史上,数据被非规范化,通过避免跨表的复杂 JOIN 的需要来提高数据仓库中的报告性能。这带来了在多个模型中保持数据最新的额外挑战,但我们将在另一天再讨论脆弱的 ETL 管道。

在一些现代(即NoSQL)数据库中,非规范化被吹捧为解决关系数据库挑战的灵丹妙药。开发人员被告知要对一切进行非规范化,以便获得现代 Web 和移动应用程序所需的灵活性和性能。对于简单的数据模型,这很容易做到并且确实提供了显着的好处。然而,对于更复杂的数据模型,它实际上会使开发变得更加困难。

非规范化的好处是:

  • 减少阻抗失配(对于简单应用)
  • 模式从一个记录到另一个记录的轻松变化
  • 通过一次性插入所有相关数据并删除跨表的 JOIN 进行检索,提高了性能。

然而,它也有权衡:

  • 数据重复:相同的值在整个数据库中多次重复,增加了存储和处理要求。
  • 数据不一致:数据重复意味着更新一个值需要在多个位置更改该值。由于这通常无法一次全部完成(或至少不能大规模完成),因此在进行更新时结果不一致
  • 难以对复杂关系进行建模,实际上增加了企业应用程序的阻抗失配。复杂应用程序的多个组件都需要在不同时间以不同方式操作相同的数据。强迫他们在一个记录中合作(或竞争)实际上是不可能的。

讽刺的是,正如由于 RAM 和磁盘的限制而开发规范化数据模型一样,非规范化的建议也是从一些早期 NoSQL 技术的缺陷出发:不支持跨表的高效 JOIN,缺乏强一致性(即使在单个记录上)以允许记录之间的引用。

混合标准化/非标准化数据模型

Couchbase 的一个非常强大的方面是它支持多种混合规范化和非规范化数据类型。通过 JSON 可以轻松实现非规范化,而通过支持 JOIN 和强一致性可以轻松实现规范化……并且两者可以并存。

  • 完全规范化的数据模型可以在多个订单中实现良好的重复数据删除。然而,在系统上线后为每个客户添加第二个(或第三个、第四个等)地址字段将是相当具有挑战性的。或者也许只为某些产品而不是其他产品添加评论。
  • 另一方面,完全非规范化的数据模型使得一个客户拥有 1 个地址而另一个客户拥有 2 个地址变得非常容易。但是,在所有订单中更新产品描述可能会非常密集(即缓慢)并导致两个根据查询数据库的时间,对同一产品有不同的描述。它还会导致客户详细信息以及产品名称和描述的大量重复,从而需要更多的资源来存储、处理、备份等。

使用 Couchbase,可以在同一模式中同时拥有规范化和非规范化数据模型。这些数据在有意义的地方进行标准化:使用订单到产品和客户的参考来避免任何数据重复或不一致。它还在有意义的地方进行了非规范化:将所有客户数据保存在一个记录中,并允许不同的客户拥有不同的信息。它甚至是同一记录中两者的混合:虽然订单引用产品和客户,但它们还包含该订单中包含的任意项目列表。这很有道理。

只有当使用的数据库不仅能够支持强一致性,而且还能够具有强大的查询语言来表达数据记录之间的复杂关系时,这才有可能实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95470.shtml

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

相关文章

网课搜题 小猿题库多接口微信小程序源码 自带流量主

多接口小猿题库等综合网课搜题微信小程序源码带流量主,网课搜题小程序, 可以开通流量主赚钱 搭建教程1, 微信公众平台注册自己的小程序2, 下载微信开发者工具和小程序的源码3, 上传代码到自己的小程序 源码下载:https://download.csdn.net/download/m0_…

set和map的封装

目录 介绍 红黑树代码 set insert的迭代器转换问题 为什么会有这样的问题? 如何解决 代码 map 注意点 代码 介绍 set和map的底层都是红黑树,所以我们可以在自己实现的红黑树(简易版)的基础上,进行封装,成为简易的set和map 红黑树代码 #pragma once#include <…

实现悲观锁和乐观锁

悲观锁和乐观锁是并发控制机制,用于多线程环境中管理共享资源的访问。 悲观锁示例 在悲观锁中,假设多个线程会相互干扰,因此在访问共享资源之前,每个线程都会尝试获取锁,以确保独占访问。Java中可以使用synchronized关键字实现悲观锁。 public class PessimisticLockEx…

力扣 -- 873. 最长的斐波那契子序列的长度

解题步骤&#xff1a; 参考代码&#xff1a; class Solution { public:int lenLongestFibSubseq(vector<int>& nums) {int nnums.size();unordered_map<int,int> hash;for(int i0;i<n;i){hash[nums[i]]i;}int ret2;vector<vector<int>> dp(n,v…

beego-简单项目写法--路径已经放进去了

Beego案例-新闻发布系统 1.注册 后台代码和昨天案例代码一致。,所以这里面只写一个注册的业务流程图。 **业务流程图 ** 2.登陆 业务流程图 登陆和注册业务和我们昨天登陆和注册基本一样&#xff0c;所以就不再重复写这个代码 但是我们遇到的问题是如何做代码的迁移&…

Vue中如何进行移动端手势操作

当开发移动端应用程序时&#xff0c;手势操作是提高用户体验的关键部分之一。Vue.js是一个流行的JavaScript框架&#xff0c;它提供了一种简单而强大的方式来实现移动端手势操作。本文将介绍如何在Vue.js中进行移动端手势操作&#xff0c;包括基本手势&#xff0c;如点击、滑动…

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

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

NPDP产品经理知识(产品创新流程)

1.复习组合管理: 组合管理的目标 ===> 价值最大化,项目平衡,战略一致,管道平衡(资源需求和供给),盈利充分 (实现财务目标) 产品创新流程就是管理风险的过程。 模糊前端: 产品创新章程:PIC 包含 =====> 背景,聚焦舞台,目标和目的,特别准则,可持续性 新产…

复习 --- 消息队列

进程间通信机制(IPC) 简述 IPC&#xff1a;Inter Process Communication 进程和进程之间的用户空间相互独立&#xff0c;但是4G内核空间共享&#xff0c;进程间的通信就是通过这4G的内核空间 分类 传统的进程间通信机制 无名管道&#xff08;pipe&#xff09; 有名管道&…

归并排序含非递归版

目录 1.归并排序的原理 2.实现归并排序 2.1框架 2.2区间问题和后序遍历 2.3归并并拷贝 2.4归并排序代码 2.5测试 3.非递归实现归并排序 3.1初次实现 3.2测试 3.3修改 3.4修改测试 1.归并排序的原理 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治…

Python 列表推导式深入解析

Python 列表推导式深入解析 列表推导式是 Python 中的一种简洁、易读的方式&#xff0c;用于创建列表。它基于一个现有的迭代器&#xff08;如列表、元组、集合等&#xff09;来生成新的列表。 基本语法&#xff1a; 列表推导式的基本形式如下&#xff1a; [expression for…

EM聚类(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

ubuntu 22.04 更新NVIDIA显卡驱动,重启后无网络图标等系统奇奇怪怪问题

环境 win10, ubuntu 22.04双系统 笔记本电脑&#xff0c;4060显卡 解决思路 具体的过程当时没有记录下来&#xff0c;然后因为在解决系统的问题&#xff0c;也没有截图啥的&#xff0c;只有一些大概记忆&#xff0c;供未来的自己参考吧。 首先是更新显卡驱动 我是直接在soft…

【uniapp+vue3+ts】请求函数封装,请求和上传文件拦截器

1、uniapp 拦截器 uni.addInterceptor(STRING,OBJECT) 拦截器中包括基础地址、超时时间、添加请求头标识、添加token utils文件夹下新建http.ts 拦截uploadFile文件上传&#xff0c;rquest请求接口 cosnt baseUrl xxxx// 添加拦截器 const httpInterceptor {//拦截前触发i…

来聊一聊独热码检测

国庆假期不小心扭伤了脚踝&#xff0c;在家没事看到一篇文章挺有意思&#xff0c;于是写出来分享给大家。 这是一道数字电路面试题&#xff0c;也是很多面试官很喜欢考察面试者的一道题目&#xff0c;题干很简单&#xff1a;给定一个4bit的信号A&#xff0c;设计逻辑来判断A是…

使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面

使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面 使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面 使用图形视图框架(Graphics View Framework)在QML中创建交互式图形界面什么是图形视图框架(Graphics View Framework)&#xff1f;…

数学建模Matlab之基础操作

作者由于后续课程也要学习Matlab&#xff0c;并且之前也进行了一些数学建模的练习&#xff08;虽然是论文手&#xff09;&#xff0c;所以花了几天零碎时间学习Matlab的基础操作&#xff0c;特此整理。 基本运算 a55 %加法&#xff0c;同理减法 b2^3 %立方 c5*2 %乘法 x 1; …

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.…

复习 --- select并发服务器

selectIO多路复用并发服务器&#xff0c;是通过轮询检测文件描述符来实现并发 将内核要检测文件描述符放入集合中&#xff0c;调用select函数&#xff0c;通知内核区检测文件描述符集合中的文件描述符是否准备就绪&#xff0c;即对应的空间中是否有数据 对准备就绪的文件描述…

WPF绑定单变量Binding和绑定多变量MultiBinding 字符串格式化 UI绑定数据,数据变化自动更新UI,UI变化自动更新数据

UI绑定数据&#xff0c;数据变化自动更新UI&#xff0c;UI变化自动更新数据。 支持多设备&#xff0c;同时下载。 绑定单变量 在WPF (Windows Presentation Foundation) 中&#xff0c;您可以使用数据绑定来将变量绑定到界面元素。这允许您在界面上显示变量的值&#xff0c;…