非规范化:多少才算太多?

2023-12-25

我已经为我正在“按书本”构建的网络应用程序设计了数据库。也就是说,我已经:

  • 创建了包含应用程序的实体、属性和关系的 E-R 图
  • 将 E-R 图转换为模式
  • 将架构转换为“无架构”形式以对数据库进行建模(该数据库是 Cassandra (NoSQL) 数据库)。

一切进展顺利(到目前为止)。我之前已经进行过非规范化并取得了很好的结果,并且目前正在实现应用程序的一部分,该部分将使用尚未非规范化的数据。我预测,针对这个特定部分这样做将在一定程度上显着提高性能(从 1 个 Column_Family(关系世界中的“表”)而不是 7 个读取)。

然而,我担心我可能会过度非规范化。如果我对有问题的部分这样做,那么我的应用程序中的 Column_Family/表数量几乎会减少大约 20%,并且由于某种原因,我的数据库的大部分非规范化让我感到紧张。

如果应用程序最终取得足够的成功,我能够让数据库设计者或管理员加入,我希望他能够确定我正在执行的非规范化对于我所实现的性能是必要的寻求(最好的情况)或至少无害(最坏的情况)。

在做出非规范化决策时,我应该注意哪些具体事项,这些事项可能表明这样做是否不好,或者是否总是归结为速度与可维护性?


为 cassandra 设计模式与为 sql 数据库设计模式有很大不同。使用 sql 数据库,您的数据可以存放在一台机器上,数据库将为您维护索引,您可以执行联接,并且可以使用 sql 进行复杂的查询。这些都使得标准化数据变得切实可行。

在 cassandra 中,您的数据不适合一台机器,因此您无法执行联接,您可以有效执行的唯一查询是获取键上的一系列列,并且 cassandra 只会为您维护有限的索引。这使得标准化数据变得不切实际。

在 cassandra 中,您通常设计模式来服务您将要进行的查询,并进行非规范化来做到这一点。我最喜欢的例子是 Twitter 对 Rainbird 的统计数据所做的处理,如下所述post http://news.ycombinator.com/item?id=2181119,

For example, say someone clicks on a t.co link to blog.example.com/foo at 11:41am on 1st Feb. 
Rainbird would increment counters for:

 t.co click: com (all time)
 t.co click: com.example (all time)
 t.co click: com.example.blog (all time)
 t.co click: com.example.blog /foo (all time)
 t.co click: com (1st Feb 2011)
 t.co click: com.example (1st Feb 2011)
 t.co click: com.example.blog (1st Feb 2011)
 t.co click: com.example.blog /foo (1st Feb 2011)
 t.co click: com (11am-12 on 1st Feb)
 t.co click: com.example (11am-12 on 1st Feb)
 t.co click: com.example.blog (11am-12 on 1st Feb)
 t.co click: com.example.blog /foo (11am-12 on 1st Feb)
 t.co click: com (11:41-42 on 1st Feb)
 t.co click: com.example (11:41-42 on 1st Feb)
 t.co click: com.example.blog (11:41-42 on 1st Feb)
 t.co click: com.example.blog /foo (11:41-42 on 1st Feb)

这1次点击复制了16次,满足了可以做的16次查询。

这是一个很好的介绍如何在cassandra中建立索引 http://www.slideshare.net/benjaminblack/cassandra-basics-indexing.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

非规范化:多少才算太多? 的相关文章

  • JDBC 和多线程

    我正在尝试使用多线程方法运行一些查询 但是我认为我做错了什么 因为我的程序需要大约五分钟来运行一个简单的选择语句 例如 SELECT FROM TABLE WHERE ID 123 我的实现如下 我使用一个连接对象 在我的运行方法中 pub
  • Oracle 中仅在一列上不同

    我想在下表中使用不同的值 但仅在 PlayerID 列上使用 这就是我现在所拥有的 MATCHID PLAYERID TEAMID MATCHDATE STARTDATE 20 5 2 14 JAN 12 01 JUN 11 20 5 4
  • 从 SQL 语句中检索元数据(表名)

    我使用的是 Visual Studio 2008 我创建了一个 Winforms 应用程序 并且尝试从 SQL 语句中提取表名 con new SqlConnection connString String queryString Sele
  • 您能否推荐一种用于测验问题和答案的数据库设计,以允许可扩展的问题类型数量? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 到目前为止的示例问题类型 多项选择单选 想想单选按钮 多项选择多项答案 考虑复选框 匹配 现在有很多可能选择的排列 我想将它们存储在一个数据库结
  • 在现有数据库内容上使用 ActiveAndroid

    我开发了一个 Android 应用程序 使用 SQLiteOpenHelper 将数据保存在 SQLite 数据库中 我想知道是否可以使用以下方式更新我的应用程序活跃Android http www activeandroid com 但以
  • 如何更新表以添加主键并使用递增的 ID 更新所有现有行?

    我导入了一个包含 20 000 行数据的表 但我忘记在其上放置主键 以便每一行都有一个唯一的键 我希望第一行从 ID 1 开始 一直递增到最后一行 最后在 ID 20000 处结束 如何使用单个查询更新所有行 我正在使用MySQL 已尝试使
  • MySQL 数据库配置在单独的类中

    是否可以在单独的类中保留所有与数据库相关的配置 主机名 用户名 密码和数据库 以及连接和选择正确数据库的功能 我尝试过这样的事情 class Database var config array username gt someuser pa
  • LINQ To SQL 是否比使用 ado.net 和 oledb 提供更快的响应时间?

    毫无疑问 LINQ 简化了数据库编程 但它有缺点吗 内联 SQL 要求以某种方式与数据库进行通信 从而打开数据库以进行注入 内联 SQL 还必须进行语法检查 构建计划 然后执行 这需要宝贵的周期 存储过程也是优秀数据库应用程序编程中坚如磐石
  • 针对表中的每一行运行 SQL Server 函数

    我有一个函数可以迭代表中的 每一行 当它运行时 它应该查看每一行 提取该行的相关 SET 值并运行该函数 该函数依次返回结果并使用正确的值更新正确的行 发生的情况是 它正在运行并返回最后一行的值 并用该值更新所有行 有什么想法我做错了吗 S
  • 将字典中的值插入到 sqlite 数据库中

    我无法理解它 我想将字典的值插入到 sqlite 数据库中 url https api flickr com services rest method flickr photos search api key 5f 1b per page
  • 如何使用 Qt/C++ 创建/读取/写入文件并将设置存储在程序本地

    我是一个不幸的 C 初学者 使用 Qt GUI 设计器程序似乎非常适合我的需求 但我在尝试编写所需的代码时遇到了问题 我可以使用 QSettings 字符串在硬盘驱动器上存储本地设置 但我个人讨厌程序执行某些程序所做的 HOME LOCAL
  • 合并具有一对一关系的表

    我有 3 个用于会员系统的 MySQL 表 users 成为用户的最低要求 仅与帐户信息相关 电子邮件 密码 is activated 等 user profiles 用户提供的个人信息 姓名 地址 电话 user member profi
  • Hibernate 中基本类型的 ArrayList

    我有一个关于整数数组列表或一般基本类型的问题 假设我正在设计一个 POS 程序 每种产品可能有多个价格 假设我可以用以下方式表示价格值ints 并在Product类我有领域ArrayList
  • 有关 items_for_sale 随着时间的推移更新的数据库/架构设计问题

    我知道我的问题的明显答案是 这取决于 解决这个问题后 我希望你们中的一个 或多个 能够帮助我找到解决这个问题的常见方法 我正在设计一个待售小部件数据库 随着时间的推移 每件商品的价格将不可避免地发生变化 我的问题是我们是否应该跟踪这些变化
  • 使用 VS 2010 数据库管理示例数据

    我正在使用 Visual Studio 2010 中的数据库项目来管理我的所有数据库代码 对于我的应用程序 我们将每个客户端的数据分离到他们自己的数据库副本中 并使用通用数据库将用户映射到适当的数据库 我希望在 TFS 中保留几个不同的示例
  • 不同的数据库使用不同的名称引用吗?

    例如 mysql引用表名使用 SELECT FROM table name 注意 其他数据库是否使用不同的字符来引用其表名 这种引号的使用称为分隔标识符 它是 SQL 的重要组成部分 因为否则您将无法使用以下标识符 例如表名和列名 包含空格
  • 我是否应该标准化我的数据库?

    在设计数据库 例如 MySQL 的模式时 会出现是否完全规范化表的问题 一方面 连接 以及外键约束等 非常慢 另一方面 您会获得冗余数据和潜在的不一致 最后优化 是正确的方法吗 即创建一个按书本规范化的数据库 然后查看可以对哪些内容进行非规
  • 与 Postgres 的 TCP 连接安全吗?需要 SSL 吗?

    早上好 我正在浏览 Postgresql 配置文件 最近注意到有一个ssl选项 我想知道什么时候需要这样做 假设您有一个应用程序服务器和一个数据库服务器 不在专用网络内运行 如果用户尝试登录 如果未启用 SSL 应用程序服务器在查找用户密码
  • 在数据库中有效存储商品位置(用于订购)

    设想 有一个用户拥有的电影数据库 电影显示在一个名为 我的电影 的页面上 电影可以按照用户想要的顺序显示 例如 位置 1 为 搏击俱乐部 位置 3 为 Drive 依此类推 显而易见的解决方案是存储每个项目的位置 例如 电影 ID 用户 I
  • 一次将多个值插入MySQL [重复]

    这个问题在这里已经有答案了 谁能解释一下为什么这个 PHP MySQL 不起作用 基本上我需要从表单中一次插入大量行 因此会有多个名称字段 多个短 中 长字段等 我收到此错误 Notice Undefined variable Short1

随机推荐

  • 如何在使用 Axis 1.4 wsdl2java 生成的客户端时获取 SOAP 消息

    对于任何具有使用 Apache Axis 的 Web 服务的中等专业知识的人来说 这可能是一个简单的问题 我有一个由 Axis 1 4 中的 wsdl2java 生成的 Web 服务客户端 我正在编写需要访问实际 SOAP 消息本身的单元测
  • 对可绘制的 alpha 属性进行动画处理

    我想要为 ViewGroup 的背景 Drawable 的 alpha 属性设置动画 我使用 view getBackground 获取对背景可绘制对象的引用 然后我使用以下代码 从这个线程 https stackoverflow com
  • Java中的SortedBiTreeMultimap数据结构?

    是否有任何具有类似 TreeMap 数据结构的 Java 库也支持所有这些 按值查找 如 Guava 的 BiMap 的可能性非唯一键以及非唯一值 如 Guava 的 Multimap 跟踪排序值以及排序的键 如果存在 它可能会被称为 So
  • 如何在ListView的项目之间设置自定义分隔符

    有没有办法使用自定义委托作为每两个连续项目之间的分隔符ListView就像header and footer特性 A ListView可以分为sections 又名团体 该文档提供了一个很好的例子here https doc qt io q
  • Java 的国际字符

    我正在构建一个应用程序 它从 java 获取信息并构建 Excel 电子表格 一些信息包含国际字符 例如 当俄语字符在 Java 中正确呈现时 我遇到问题 但当我将这些字符发送到 Excel 时 它们无法正确呈现 我最初认为问题是编码问题
  • 使用插入单元格到表中时,UITableViewCell 不使用自动布局高度

    背景 我按照说明使用 purelayout 以编程方式创建 UITableViewCellshere https stackoverflow com a 18746930 766570 它基本上表明您必须在单元格上设置顶部 底部约束 然后使
  • 命令参数字符串未计算

    我在 aspx 页面内有一个命令参数 设置为 for 循环内的对象变量 如下所示
  • 将 Monolog WebProcessor 与 Laravel 5.6 结合使用

    我发现新的日志堆栈 通道提供了一种方法tap或定义handlers 但是 我正在努力获得WebProcessor已加载 但似乎不起作用 这个应该被挖掘吗 或者有其他方法来加载它吗 这是 Laravel 5 6 特有的 这是我在使用 Lara
  • 如何使用 JAXB 从 Java 中的 XSD 获取 minOccurs / maxOccurs 值?

    我的应用程序正在调用 Web 服务 并且我已使用 maven jaxb2 plugin 从 WSDL XSD 生成了 Java 类 Web 服务调用在一段时间内工作得很好 但最近我在将对象编组到 XML 时遇到了问题 org xml sax
  • amqp 或 xmpp 用于实时在线游戏[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 以下哪些技术套件适用于多用户在线游戏项目 项目要求 能够在任何给定时间处理 2k 5k 用户 适用于
  • CleanWPPAllFilesInSingleFolder 错误使我的项目不再加载

    我使用 VS2012 创建了一个动态数据项目 一切顺利 然后我开始配置 Web 部署设置 我不确定我到底更改了什么设置 因为没有错误 但是 当我尝试加载解决方案时 我收到该项目的以下错误 并且它将不再加载 Specified conditi
  • 为什么我会收到此 LineUnavailableException?

    我在代码的第 34 行不断收到 LineUnavailableException https www refheap com 21223 https www refheap com 21223 错误读取为javax sound sample
  • 使用 ConstraintLayout 的展开链元素组

    我在使用约束布局传播 2 组元素时遇到问题 我知道这个新布局的目标是使用平面层次结构 因此我想避免将我的元素放入子布局中 我查看了一些很棒的资源 例如constraintlayout com 但无法弄清楚如何使其适用于我的特定案例 我认为这
  • 协会类别的独特性

    我很难理解 UML 2 5 规范中解释的关联类的概念 最让我困惑的是下面这句话 摘自199页 笔记 即使当 AssociationClass 的所有末端都具有 isUnique true 时 也可能有多个实例关联末端类的同一组实例 正如这里
  • 如何能够显示没有文本的表 TD

    我的问题 如何让表格的 TD 不带有文本 而不使其消失 我使用这个 HTML 代码 div div div table cellpadding 0 cellspacing 0 border 0 tr td td td td td td tr
  • 如何在 Windows 上集成 PHP 和 R?

    集成 PHP 和 R 时遇到一些问题 我正在研究这篇文章 http www r bloggers com integrating php and r http www r bloggers com integrating php and r
  • CSS 类align-self-end 不起作用

    div class col md 3 div class card bg dark text white img class card img src http via placeholder com 300x340 alt Card im
  • Laravel proc_open():分叉失败

    我在 laravel 后出现此错误composer update 未捕获的ErrorException proc open fork失败 资源在vendor symfony console Terminal php中暂时不可用 127 pr
  • Zend 捕获布局并将内容视为变量

    我有一个控制器 My Controller 带有简单的示例操作 public function exempleAction Using layout mail this gt helper gt layout gt setLayout ma
  • 非规范化:多少才算太多?

    我已经为我正在 按书本 构建的网络应用程序设计了数据库 也就是说 我已经 创建了包含应用程序的实体 属性和关系的 E R 图 将 E R 图转换为模式 将架构转换为 无架构 形式以对数据库进行建模 该数据库是 Cassandra NoSQL