标签: denormalization

在Oracle中保持表同步

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

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

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

谢谢,

安迪

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

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

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

sql oracle synchronization triggers denormalization

6
推荐指数
1
解决办法
1万
查看次数

规范化是否真的会损害高流量网站的性能?

我正在设计一个数据库,我想规范化数据库.在一个查询中,我将加入大约30-40个表.如果它变得非常受欢迎,这会损害网站性能吗?这将是主要查询,它将在50%的时间内被调用.我将加入关于两个表的其他查询.

我现在可以选择标准化或不标准化,但如果标准化将来成为问题,我可能需要重写40%的软件,这可能需要很长时间.在这种情况下,规范化真的会受到伤害吗 在我有空的时候,我应该现在正常化吗?

c# performance normalization denormalization sql-server-2008

6
推荐指数
1
解决办法
774
查看次数

在数据库中保留小计字段是一个坏主意

我有一个MySQL表,代表一个订单列表和一个相关的子表,代表与每个订单关联的货件(一些订单有多个货件,但大多数只有一个).

每批货物都有许多费用,例如:

  • ItemCost
  • 运输费
  • HandlingCost
  • TaxCost

应用程序中有许多地方需要获取订单的综合信息,例如:

  • TotalItemCost
  • TotalShippingCost
  • TotalHandlingCost
  • TotalTaxCost
  • 总成本
  • 总支付
  • TotalProfit

所有这些字段都取决于相关货件表中的汇总值.此信息用于其他查询,报告,屏幕等,其中一些必须快速为用户返回数万条记录的结果.

在我看来,有几个基本的方法可以解决这个问题:

  1. 使用子查询可在需要时从货件表中计算这些项目.对于需要全部或部分此类信息的所有查询,这会使事情变得复杂.它也很慢.

  2. 创建一个将子查询公开为简单字段的视图.这使得需要它们的报告变得简单.

  3. 在订单表中添加这些字段.这些将为我提供我正在寻找的性能,代价是在我对货件记录进行任何更改时必须复制数据并进行计算.

另一件事,我正在使用一个业务层来公开函数来获取这些数据(例如GetOrders(过滤器))并且我不需要每次都使用小计(或者某些时候只需要其中的一些),所以生成一个每次(即使从一个视图)子查询可能是一个坏主意.

是否有任何人可以指出我帮助我决定最佳设计的最佳实践?

顺便说一下,我最终做了#3主要是出于性能和查询简单性的原因.

更新:

很快就得到了很多很棒的反馈,谢谢大家.为了给出更多背景信息,显示信息的地方之一是在管理控制台上,我有一个可能很长的订单列表,需要为每个订单显示TotalCost,TotalPaid和TotalProfit.

mysql database-design denormalization

6
推荐指数
1
解决办法
720
查看次数

使用JSON而不是规范化数据,这种方法是否正确?

在MySQL innoDB表中都有微博帖子和与它们相关的投票/表情符号.需要两种类型的页面:

(A)包含许多微博的列表页面以及他们的投票计数/表情符号在单页上计数(比如说25).

例如

伟大的有趣的帖子

不是那么有趣的内容,意味着有趣的帖子.Lorem ipsum dolor坐下来,精致的adipistur elit.Phasellus euismod consequat pellentesque......阅读更多....

(3)喜欢,(5)无聊,(7)微笑

.+ 24个同一页面上的帖子.

(B)永久链接页面包含一个具有详细投票+投票计数/表情符号的微博.

伟大的有趣的帖子

不是那么有趣的内容,意味着有趣的帖子.Lorem ipsum dolor坐下来,精致的adipistur elit.Phasellus euismod consequat pellentesque.Quisque viverra adipiscing auctor.Mauris ut diam risus,在fermentum elit.Aliquam urna lectus,egestas sit amet cursus et,auctor ut elit.Nulla tempus suscipit nisi,nec condimentum dui fermentum non.在eget lacus mi,ut placerat nisi.

(你,Derp和1更像这样),(5)无聊,(7)微笑

第一种方法:

表格1:

post_id | post_content | post_title | creation_time 
Run Code Online (Sandbox Code Playgroud)

表#2用于存储投票,喜欢,表情符号:

action_id | post_id | action_type | action_creator | creation_time
Run Code Online (Sandbox Code Playgroud)

显示帖子页面或单个帖子.查询第一个表以获取帖子,查询第二个表以获取与帖子相关的所有操作.无论何时完成投票等,都会在post_actions表格中插入一个插入内容.

第二种方法:

表格1: …

mysql json innodb denormalization

6
推荐指数
1
解决办法
1279
查看次数

将行反规范化为列可以增强SQL Server的性能吗?

我有一个数据,它是一个整数值矩阵,表示带状分布曲线.我正在针对INSERT性能优化SELECT性能.最多有100个乐队.我主要是通过在一段时间内对频段求和或求平均来查询这些数据.

我的问题是,通过在每个频段有1列的表格中展平这些数据,或者使用表示频段值的单个列,我可以获得更好的性能吗?

扁平化数据

UserId ActivityId DateValue Band1 Band2 Band3....Band100
10001  10002      1/1/2013  1     5     100      200
Run Code Online (Sandbox Code Playgroud)

或标准化

UserId ActivityId DateValue Band BandValue
10001  10002      1/1/2013  1    1
10001  10002      1/1/2013  2    5
10001  10002      1/1/2013  3    100
Run Code Online (Sandbox Code Playgroud)

示例查询

SELECT AVG(Band1), AVG(Band2), AVG(Band3)...AVG(Band100)
FROM ActivityBands
GROUP BY UserId
WHERE DateValue > '1/1/2012' AND DateValue < '1/1/2013'
Run Code Online (Sandbox Code Playgroud)

sql sql-server denormalization database-normalization

6
推荐指数
1
解决办法
1829
查看次数

什么是最大的非规范化和标准化数字?(64位,IEE 754-1985)

我对浮点运算很感兴趣,因为我真的很想理解这个话题!

我知道数字可以用科学记数法表示.

因此,对于这两个数字,指数应如下所示:

非规范化数: 11 .... 11 so(1 + 1/2 + 1/2 ^ 2 + ... + 1/2 ^ 52)*2 ^ 1023

归一化数: 11 .... 11 so(1 + 1/2 + 1/2 ^ 2 + ... + 1/2 ^ 52)*2 ^ 1024

但是,我不确定这是否正确?

我真的很感激你的回答!

PS.:在维基百科上给出了这个数字!但是,我不知道他们是怎么想出来的......

floating-point binary denormalization floating-accuracy ieee-754

6
推荐指数
1
解决办法
9616
查看次数

elasticsearch:保留冗余(非规范化)数据或保留一个id列表以进行交叉引用?

将冗余数据存储在索引中还是有两个索引然后交叉引用它们会更好吗?即,用户想要在剧院查看电影.

由于用户有兴趣通过影院查看电影,我们可以使用电影nested_type的影院索引:

// Here, movies field will be a Nested Type, not Object Type.

eclient.index({
    index: 'myindex',
    type: 'theater',
    id: 1,
    body: {
        name: "Grand Cinema",
        description: "Come watch movies!",
        movies: [
           {
               title: "Red November",
               description: "A submarine hunt",
               rated: "R",
               score: 10.0
           },
           {
               title: "Cinderbrella",
               description: "A burnt umbrella",
               rated: "PG",
               score: 8.8
           }
        ]

    }
});
Run Code Online (Sandbox Code Playgroud)

由于数据在影院上非规范化,因此可以很容易地通过影院显示电影的简短列表.

我们还可以有一个电影索引,其中包含有关电影的更多详细信息:

eclient.index({
    index: 'myindex',
    type: 'movie',
    id: 1,
    body: {
        title: "Red November",
        description: "A submarine hunt",
        rated: "R", …
Run Code Online (Sandbox Code Playgroud)

javascript denormalization node.js elasticsearch

6
推荐指数
1
解决办法
1329
查看次数

构建Firebase中的关系

我的Firebase中有两个项目:providers而且services,我正在尝试使用Firebase推荐的扁平化架构方法找出构建和建立关系的最佳方法.

我的数据看起来像这样:

{
  "services" : {
    "hip_replacement" : {
      "title" : "Hip Replacement"
    }
  },

  "providers" : {
    "the_blue_hospital" : {
      "title" : "The Blue Hospital"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我想将这两个项目链接在一起,这样如果您要访问髋关节置换页面,蓝色医院会显示在它下面,如果您要访问蓝色医院页面,髋关节置换将显示在其下方.基本上是一种双向关系.

构建这样的东西最好的方法是什么?我在考虑以下几点:

{
  "services": {
    "hip_replacement": {
      "title": "Hip Replacement",
      "providers": {
        "the_blue_hospital": true,
        "the_red_hospital": true
      }
    },
    ...
  },
  "providers": {
    "the_blue_hospital": {
      "title": "The Blue Hospital",
    },
    "the_red_hospital": {...
    },
    "the_green_hospital": {...
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现这个或更优雅的解决方案?任何帮助表示赞赏.

提前致谢!

denormalization relationship firebase

6
推荐指数
1
解决办法
9708
查看次数

事件源:使投影中的关系不规范

我正在研究CQRS / ES体系结构。我们将多个异步投影并行运行到读取存储中,因为某些投影可能比其他投影慢得多,并且我们希望与写入端保持更多同步,以实现更快的投影。

我正在尝试了解有关如何生成读取模型以及可能需要进行多少数据重复的方法。

让我们以带有物料的订单作为简化示例。一个订单可以有多个项目,每个项目都有一个名称。项目和订单是单独的汇总。

我可以尝试以更规范的方式保存读取的模型,在该模型中,我为每个项目创建实体或文档并订购,然后对其进行引用-或者我可能想以更规范化的方式在有订单的情况下保存它其中包含项目。

归一化

{
  Id: Order1,
  Items: [Item1, Item2]
}

{
  Id: Item1,
  Name: "Foosaver 9000"
}

{
  Id: Item2,
  Name: "Foosaver 7500"
}
Run Code Online (Sandbox Code Playgroud)

使用更规范的格式将允许单个投影处理影响/影响物品和订单的事件并更新相应的对象。这也意味着项目名称的任何更改都会影响所有订单。例如,客户可能会收到与相应发票不同的其他物品的交货单(显然,该模型可能不够好,并导致我们面临与非规范化相同的问题...)

非正规化

{
  Id: Order1,
  Items: [
    {Id: Item1, Name: "Foosaver 9000"},
    {Id: Item2, Name: "Foosaver 7500"},
  ]
}
Run Code Online (Sandbox Code Playgroud)

但是,反规范化将需要一些可以在其中查找当前相关数据的源(例如项目)。这意味着我要么必须传输事件中可能需要的所有信息,要么必须跟踪为非规范化而获取的数据。这也意味着我可能需要为每个投影执行一次操作(即,我可能需要一个非规范化的ItemForOrder以及一个非规范化的ItemForSomethingElse),它们都只包含每个非规范化实体或文档所需的最基本的属性(无论它们是什么时候)创建或修改)。

如果我要在读取存储中共享相同的物料,则最终可能会从不同的时间点混合物料定义,因为物料和订单的预测可能不会以相同的速度运行。在最坏的情况下,项目的投影可能尚未创建我需要为其属性来源的项目。

通常,在处理事件流中的关系时我有什么方法?


更新2016-06-17

目前,我正在通过针对每个非规范化读取模型及其相关数据运行单个投影来解决此问题。如果我有多个必须共享相同相关数据的读取模型,那么我可能会将它们放在同一投影中,以避免重复查找所需的相同相关数据。

这些相关的模型甚至可能已被标准化,优化,但是我必须访问它们。我的投影是唯一读取和写入它们的东西,因此我确切地知道如何读取它们。

// related data 
public class Item 
{
  public Guid Id {get; set;}
  public string Name {get; set;}
  /* and whatever else …
Run Code Online (Sandbox Code Playgroud)

projection denormalization cqrs event-sourcing

6
推荐指数
1
解决办法
1210
查看次数

为React + Redux应用发送回规范化或非规范化的API响应更好吗

我正在编写一个react-redux应用程序。首先,它调用单个端点,该端点返回大量数据作为高度嵌套的JSON。然后,我对其进行规范化并将其放入我的redux-orm模式。
对我来说,在后端创建嵌套数据只是为了遍历前端的嵌套数据以对其进行规范化似乎是很愚蠢的,因为它来自标准化的PostgreSQL数据库。

Database = Normalized --> 
API = Denormalized --> 
Frontend = Normalized
Run Code Online (Sandbox Code Playgroud)

只是发送回标准化的API响应是最佳实践吗?

normalize denormalization reactjs redux redux-orm

6
推荐指数
1
解决办法
815
查看次数