问题标签 [denormalization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
1182 浏览

database - 船舶管理数据库结构讨论(应该非规范化?)

我的软件几天前投入生产,现在我想就数据库结构进行一些争论。

软件收集船舶数据,目前每艘船舶有174个详细信息,每个详细信息可以是文本值、长文本值、数字(指定长度,有或没有指定小数位数)、日期、日期随着时间的推移,一个布尔字段,一个包含许多值的菜单,一个数据列表等等。

我用下表解决了这个问题

我刚刚阅读了这篇文章:http ://thedailywtf.com/Articles/The_Inner-Platform_Effect.aspx和http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID :10678084117056

文章说这不是处理问题的正确方法。

我的客户在更改详细信息描述并添加更多详细信息时具有详细信息和组的管理 gui。

数据输入表单是通过从 DetailGroups 和 DetailTypes 中读取结构动态构建的,每个详细类型生成一个指定的输入控件。

评论表明解决此问题的另一种方法是从表中动态创建和删除列。

你怎么看?

图表截图: http://img24.imageshack.us/my.php?image= 66604496uk3.png

0 投票
2 回答
581 浏览

nhibernate - NHibernate 是否可以在不使用存储过程的情况下进行非规范化更新?

我正在考虑在一个项目中使用 NHibernate,该项目的数据库具有一定程度的计划非规范化(由 DBA 计划)。从一组表中读取并将一列映射到一个属性不是问题。但是,在更新时,我必须将一个属性映射回原始表中的原始列,并在非规范化表中更新该列的几个副本。是否可以在不使用存储过程的情况下使用 NHibernate 做到这一点?

编辑:虽然我倾向于同意 NXC 的回答,但这个问题是关于如何解决 NHibernate 的问题,而不是在数据库中解决问题。

0 投票
6 回答
1000 浏览

mysql - 应该对总计进行非规范化吗?

我正在一个带有简单规范化数据库的网站上工作。

有一个名为 Pages 的表和一个名为 Views 的表。每次查看 Page 时,该 View 的唯一记录都会记录在 Views 表中。

在网站上显示页面时,我使用一个简单的 MySQL COUNT() 来汇总显示的视图数。

数据库设计似乎很好,除了这个问题:我不知道如何检索数千个浏览次数最多的前 10 个页面。

我是否应该通过添加 Pages.views 列来保存每个页面的总视图数来非规范化 Pages 表?或者有没有一种有效的方法来查询前 10 个浏览次数最多的页面?

0 投票
8 回答
518 浏览

sql - 餐桌设计

我想知道这是一个好的设计,假设表格如下

请注意国家 fk 如何在 3 个表格中重复?并在 2 个表中重复状态 fk?谁能告诉我这是不是一个好的设计?如果是这样,为什么?因为我不认为有必要经常重复它。

干杯

0 投票
1 回答
2499 浏览

oracle - Oracle:将名称值对展平到表中

我希望有人可以提供一些建议,以更轻松地解决此问题。我正在努力为一组高度规范化的数据创建一个平面视图。扁平化的目标是提供一个普通人可以用来开发报告的视图。源数据包含几个表,如下所示:

记录值表中的 variable_id 对应于原始输入流中的变量之一,例如地址或帐户余额。对于其中包含 12 个变量的输入记录,记录值表中将有 12 行。

原始过程的输入包括不同宽度和变量名称的记录。这些被拆分为 record_values 表中的名称/值元组。我正在编写一个程序来将变量重新组合成一个看起来像的记录

我目前的方法是通过查找给定运行集的唯一变量来动态构建表(这里的细节不重要),然后构建将创建表的 SQL 字符串。

我的挑战是如何有效地从原始数据加载这个生成的工作表。由于变量的名称和数量因 run_id 而异,我能想到的唯一方法是通过以下方式:

这将永远运行,因为父表有 100 的数百万行。

有没有人知道如何生成一种我可以用来对每个目标行进行一次更新的方法?

以免有人跳上原始表格的设计——这样做是有商业原因的。我不喜欢它,但这样做是有充分理由的。

感谢您提供的任何想法。

安德鲁

0 投票
5 回答
2679 浏览

sql-server-2005 - 如何对高度规范化的数据库系统进行非规范化?

我希望将一些数据库非规范化引入高度规范化的系统。

我拥有大量数据库,这些数据库已经发展了十多年,并且负载量不断增加,因此我希望提高性能并可能降低某些查询的复杂性。

执行 10 次连接来完成存储过程中的任何给定任务的情况并不少见。有人告诉我,超过 6 种臭味。

我应该保持表结构不变并提供一些物化视图或非规范化的“缓存”表。

一些关于最佳实践的建议或推动正确方向会有所帮助。

谢谢

0 投票
4 回答
12222 浏览

sql - 在 Oracle 中保持表同步

我们即将进行并行测试,以将旧系统与新的闪亮版本进行比较。我们有一个 Oracle 数据库表 A,它存储旧系统的数据,以及一个等效的表 B,它存储新系统的数据,因此在测试期间,数据库是非规范化的。(此外,遗留系统和表 A 是固定的 - 不允许更改)

我想要做的是允许 A 上不常见的 DML 操作传播到 B,反之亦然。我开始使用一对触发器来执行此操作,但遇到了一个明显的问题,即当触发器运行时,表正在发生变化,并引发异常。

有处理这个问题的标准方法吗?我已经阅读了关于是否使用 dbms_scheduler 的不同报告...

谢谢,

安迪

更新: 我最终退出了整个问题,并确保所有更新 A 的存储过程也更新 B,反之亦然。

我已将 Quassnoi 的答案标记为已接受,因为如果将来遇到同样的问题,我会遵循他的建议。

我已经标记了 JosephStyon 的答案,因为我通过在表 A 和 B 上添加两个插入/更新语句级触发器来简单地工作,然后使用 A 或 B 作为主表执行合并过程,具体取决于运行的触发器(尽管首先我检查了目标表是否会被合并更改,如果没有则提前退出)。

0 投票
8 回答
10175 浏览

sql - 通过 SQL 查询安全地规范化数据

假设我有一张客户表:

此表没有键。但是,customer_name对于customer_address 任何给定的customer_number.

此表包含许多重复客户的情况并不少见。为了避免这种重复,以下查询仅用于隔离唯一客户:

幸运的是,该表传统上包含准确的数据。也就是说,从来没有冲突customer_namecustomer_addressfor any customer_number。但是,假设有冲突的数据确实进入了表中。我希望编写一个失败的查询,而不是为有customer_number问题的返回多行。

例如,我尝试了这个查询但没有成功:

有没有办法使用标准 SQL 编写这样的查询?如果没有,在特定于 Oracle 的 SQL 中是否有解决方案?

编辑:奇怪查询背后的理由:

说实话,这个客户表实际上并不存在(谢天谢地)。我创建了它,希望它足够清晰来展示查询的需求。但是,基于该示例,人们(幸运地)意识到对此类查询的需求是我最不担心的。因此,我现在必须剥离一些抽象概念,并希望恢复我提出这种可憎的桌子的声誉......

我从外部系统收到一个包含发票(每行一个)的平面文件。我逐行阅读了这个文件,将它的字段插入到这个表中:

如您所见,来自外部系统的数据是非规范化的。也就是说,外部系统在同一行上同时包含发票数据及其关联的客户数据。多张发票可能会共享同一个客户,因此可能会有重复的客户数据。

在保证所有客户都已在系统中注册之前,系统无法开始处理发票。因此,系统必须识别唯一客户并在必要时对其进行注册。这就是我想要查询的原因:因为我正在处理我无法控制的非规范化数据

希望这有助于澄清问题的初衷。

编辑:好/坏数据的例子

澄清一下:customer_name并且customer_address只需要对特定的customer_number.

前两行很好,因为它是相同的customer_name并且customer_address对于customer_number1。

中间两行很好,因为它customer_name与2 相同(即使另一行具有相同的and )。customer_addresscustomer_numbercustomer_numbercustomer_namecustomer_address

最后两行不行,因为 3 有两个不同customer_address的 es customer_number

如果针对所有六行运行,我正在寻找的查询将失败。但是,如果实际仅存在前四行,则视图应返回:

我希望这能澄清我所说的“冲突customer_namecustomer_address”的意思。它们必须是唯一的customer_number

我感谢那些解释如何从外部系统正确导入数据的人。事实上,我已经在做大部分事情了。我故意隐藏了我正在做的所有细节,以便更容易专注于手头的问题。此查询并不是唯一的验证形式。我只是认为这会是一个很好的画龙点睛(可以说是最后的防守)。这个问题只是为了调查 SQL 的可能性。:)

0 投票
5 回答
1758 浏览

database - 非规范化会对查询、连接和响应时间产生什么影响?

在非规范化之前,我想知道这将对以下内容产生什么影响:

  • 查询响应时间
  • 数据库中的行宽
  • 结果所需的联接
  • 完成请求所需的查询数

如果我没记错的话,似乎所有这些都会减少

0 投票
4 回答
490 浏览

sql-server - 请帮助解释我是否为了性能而破坏我的数据库架构:(

在 Sql 2008 上(之前是 05 年),我在生产中使用了将近 3 年的数据库。一直很好,但性能不是很好。所以我正在调整架构和查询以帮助加快一些事情。此外,每张主表包含大约 1-3 个轧机行(以提供对大小的 ua 估计)。

这是一个示例数据库图(Soz,在 NDA 下,所以我无法显示原件):-

替代文字 http://img11.imageshack.us/img11/4608/dbschemaexample.png

注意事项(与我的问题直接相关):-

  • 车辆可以有 0 (NULL) 或 1 个 Radio。(左外连接)
  • 车辆可以有 0 个(NULL)或 1 个杯托(左外连接)
  • 车辆有 1 种轮胎类型(内连接)。

首先,这看起来像一个规范化的数据库模式。我很烂,DB理论,所以我猜这是3NF(至少)......著名的遗言:)

现在,这正在扼杀我的数据库性能,因为这两个外连接和内连接被调用了很多,并且在许多语句中还有一些连接。

为了尝试解决这个问题,我想我可以尝试indexed view。创建视图是小菜一碟。但是索引它不起作用->无法使用连接或自引用表创建索引视图(也是另一个问题:()。

所以,我已经哭了好几个小时(和/wrists染了头发写了一首关于它的 emo 歌曲并将它放在 myfailspace 上)并做了以下事情......

  1. 在每个“可选”外部连接表中添加了一个新行(在本例中为 Radios 和 CupHolders)。ID = 0,其余数据 = 'Unknown Blah' 或 0。
  2. 更新父表,使任何 NULL 数据现在都有一个 0。
  3. 将关系从外部联接更新到内部联接。

现在,这行得通。我什至可以制作索引视图,现在速度非常快。

所以……我很痛苦。这与我所学的一切背道而驰。我觉得脏。独自的。已感染。

这是一件坏事吗?这是为了性能而对数据库进行非规范化的常见场景吗?

我很想对此有一些想法,请:)

PS。谷歌随机找到的那些图片——所以不是我。