标签: denormalization

将非规范化文件中的数据加载到规范化表中

我收到一个非规范化的文本文件,必须加载到规范化的表中.

非规范化表:

客户ID - 类别 - 类别2 - 类别3 - 类别4
1 - A - B - C - D.

当这被标准化时,它应该看起来像:

客户ID - 类别
1 - A
1 - B
1 - C
1 - D.

编写T-SQL语句以实现此目的的最佳方法是什么(SQL Server 2008)?

sql t-sql sql-server normalization denormalization

5
推荐指数
1
解决办法
2089
查看次数

物化视图可以用作快速的非常规大表吗?

可以使用Oracle Materialized视图来连接具有外键的多个相关表,以创建更大的非规范化大表,并立即刷新吗?

在一些调查中,它表示在使用快速刷新时不允许连接.

我的假设是错误的,我可以用Oracle Materalized视图做这种事情吗?

oracle bigtable materialized-views denormalization

5
推荐指数
1
解决办法
570
查看次数

从关系数据库到非关系数据库的数据规范化的最佳实践

我正在运行一个开始超越简单性能和Tunning的网站.这是一个PHP应用程序,MySQL作为后端.正确调整MySQL并优化代码.

问题是,我发现我可以使用某种非规范化来加快速度.

假设您有一个类似于ebay或亚马逊的网站.您的数据库中有产品,其中包含一些相关信息(卖家,购买产品的客户,城市,州等).这将是Relational DataBase中的多个表,并且很好地保持这种方式以获得良好的查询.但是,例如,对于主页,您可以使用一个非规范化文档(例如,在MongoDB中).可以是最新产品的集合,denormalied,类似于:

products = {
   {
      id:13,
      name:"Some product",
      city:"aCity",
      state:"aState",
      price:"10"
   },
   {
      id:123,
      name:"another product",
      city:"aCity",
      state:"aState",
      price:"10"
   }
}
Run Code Online (Sandbox Code Playgroud)

这样,我可以查询该集合而不是MySQL数据库(包含所有连接),事情可以变得非常快.

现在,问题就在这里.何时以及如何对数据进行非规范化?例如,我可以决定在插入数据时对数据进行非规范化.

所以,在我的"create-product.php"中(简单地说).我可以为mysql做所有"插入",之后我可以保存到Mongo集合.

或者,我可以在服务器中运行一个程序.或者让一些cron来寻找最新产品.

所有这些都是可能的.你是做什么?你的经验是什么?

非常感谢.

php mysql performance denormalization mongodb

5
推荐指数
1
解决办法
1003
查看次数

Logstash-> Elasticsearch-更新非规范化数据

用例说明

我们有一个关系数据库,其中包含有关我们日常运营的数据。目的是允许用户使用全文本搜索引擎来搜索重要数据。数据经过规范化,因此不是进行全文查询的最佳形式,因此,其想法是对数据的一部分进行规范化,然后将其实时复制到Elasticsearch,这使我们能够创建快速而准确的搜索应用程序。

我们已经有了一个启用数据库操作(插入,更新,删除)事件搜索的系统。事件仅包含已更改的列和主键(在更新中,我们没有得到整行)。Logstash已经为每个事件得到通知,因此这部分已经得到处理。


实际问题

现在我们要解决我们的问题。由于计划是对数据进行非规范化,因此我们必须确保将父对象的更新传播到Elasticsearch中的非规范化子对象。我们如何配置logstash来做到这一点?

假设我们Employees在Elasticsearch中维护一个列表。每个Employee都分配给一个Company。由于数据是非规范化的(出于快速搜索的目的),每个数据Employee还带有的名称和地址Company。更新会更改a的名称Company- 我们如何配置logstash来更新Employees分配给的所有公司名称Company


补充说明

@Darth_Vader:我们面临的问题是,我们得到一个事件a Company发生了变化,但是我们希望Employee在Elasticsearch中修改类型的文档,因为它们本身携带有关公司的数据。您的答案期望我们会为每一个事件Employee,但事实并非如此。

也许这将使其更加清晰。我们在Elasticsearch中有3名员工:

{type:'employee',id:'1',name:'Person 1',company.cmp_id:'1',company.name:'Company A'}
{type:'employee',id:'2',name:'Person 2',company.cmp_id:'1',company.name:'Company A'}
{type:'employee',id:'3',name:'Person 3',company.cmp_id:'2',company.name:'Company B'}
Run Code Online (Sandbox Code Playgroud)

然后在源数据库中发生更新。

UPDATE company SET name = 'Company NEW' WHERE cmp_id = 1;
Run Code Online (Sandbox Code Playgroud)

我们在logstash中得到一个事件,它表示如下内容:

{type:'company',cmp_id:'1',old.name:'Company A',new.name:'Company NEW'}
Run Code Online (Sandbox Code Playgroud)

然后,应将其传播到Elasticsearch,以使最终的雇员为:

{type:'employee',id:'1',name:'Person 1',company.cmp_id:'1',company.name:'Company NEW'}
{type:'employee',id:'2',name:'Person 2',company.cmp_id:'1',company.name:'Company NEW'}
{type:'employee',id:'3',name:'Person 3',company.cmp_id:'2',company.name:'Company B'}
Run Code Online (Sandbox Code Playgroud)

请注意,该字段已company.name更改。

denormalization event-sourcing elasticsearch logstash

5
推荐指数
1
解决办法
397
查看次数

对SQL查询进行非规范化并组合列

我有一个查询,我需要以一种有趣的方式反规范化.

这是来源:

SELECT
  BILL_Invoice.Invoice_Number as AccountNumber,
  replace(convert(varchar(10), dbo.BILL_Invoice.Invoice_Date,101) ,'/','') as AdmitDate,
  BILL_InvoiceCPT.InvoiceCPT_Code AS CPTCode,
  InvoiceCPT_FeeAmount as ItemCharge
FROM
  dbo.BILL_InvoiceCPT 
  LEFT JOIN dbo.BILL_Invoice
  ON dbo.BILL_InvoiceCPT.Invoice_ID = dbo.BILL_Invoice.Invoice_ID
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

AccountNumber | AdmitDate  | CPTCode | ItemCharge
38689         | 02192013   | 99213   |     110.00
38689         | 02192013   | 80053   |       0.00
38689         | 02192013   | 86361   |       0.00
38689         | 02192013   | 85025   |       0.00
38689         | 02192013   | 87536   |       0.00
38689         | 02192013   | 93000   |      25.00
Run Code Online (Sandbox Code Playgroud)

我需要的是:

AccountNumber | AdmitDate …
Run Code Online (Sandbox Code Playgroud)

sql denormalization

4
推荐指数
1
解决办法
4291
查看次数

非规范化如何成为NoSQL DB的属性

在讨论针对传统RDBMS的NoSQL数据库时,许多文章都说,在NoSQL-DB中,所有相关数据都保存在一起,因此可以避免连接.因此,检索数据更快.简而言之,数据是非规范化的.非规范化也存在缺点.例如冗余,额外空间,需要在多个地方更新数据等

但不论非规范化的利弊是什么; 它是一个DB设计属性.如何将其归因于特定的DB类型?如果在给定的情况下,可以对数据进行非规范化,那么也可以在RDBM中实现相同的数据.

那么为什么将非规范化作为NoSQL db的属性进行讨论呢?

rdbms denormalization nosql

4
推荐指数
2
解决办法
729
查看次数

在 DynamoDB 表上搜索数组项

我需要了解如何搜索属于数组的 DynamoDB 的属性。

因此,在对表格进行非规范化时,假设一个人有许多电子邮件地址。我会在 person 表中创建一个数组来存储电子邮件地址。

现在,由于电子邮件地址不是排序键的一部分,如果我需要对电子邮件地址执行搜索以查找人员记录。我需要索引电子邮件属性。

  1. 我可以在电子邮件地址上创建一个索引吗,它与个人记录是一对多的关系,并且按照我在 DynamoDB 中的理解,它存储为一个数组。
  2. 这个二级索引是全局的还是本地的?假设我有数十亿人的记录?
    1. 如果我可以将其创建为 LSI 或 GS​​I,请解释每个的优缺点。

非常感谢!

indexing denormalization amazon-dynamodb

4
推荐指数
2
解决办法
5166
查看次数

创建另一个表和在 postgres 中使用数组有什么区别

在我的大学里,我的任务是创建一个简单的大学数据库,其中包含一些表,如学生、部门等。当我处理学生和班级之间的关系时,有一个有趣的时刻,一个学生可以选择多个班级,我被教导要创建带有两个 FK 的第三个表,它应该看起来像这样 Adam(id - 1) 参加了数学课程(id - 5),在第三个表中,记录将是 (1, 5),这里有一个问题为什么我们是否应该更喜欢第三个表而不是数组,对我来说,将学生的班级作为学生表中的附加列看起来更容易。这是一个例子,想象一下学生表(id, name, age, arrayOfClassesID) (1, Adam, 20, [1,8,9,6,7])

PS这不是我的作业,我已经做过了,但这对我来说真的很有趣

arrays postgresql database-design denormalization

4
推荐指数
1
解决办法
726
查看次数

如何在不锁定表的情况下向 Postgres 中的 ENUM 添加新值?

我尝试了两种方法。

方法 1:使用添加的新值创建一个新的 ENUM 并就地切换数据类型:

-- Rename existing enum
ALTER TYPE animal_species RENAME TO animal_species_old;

-- Create new enum with new value
CREATE TYPE animal_species AS ENUM (
  'dog',
  'cat',
  'elephant'
);

-- Update the column of Animals to use the new enum
ALTER TABLE "Animals" ALTER COLUMN species SET DATA TYPE animal_species USING species::text::animal_species;

DROP TYPE animal_species_old;
Run Code Online (Sandbox Code Playgroud)

方法二:使用临时列

-- Create new enum type with a new name (this will be the name of the enum from now on)
CREATE …
Run Code Online (Sandbox Code Playgroud)

sql postgresql enums denormalization

4
推荐指数
2
解决办法
2892
查看次数

SQL 数据库中非规范化的实际示例?

过去 20 分钟我一直在阅读有关非规范化的内容,但无法获得带有代码的简洁示例。

这就是非规范化吗?


1.我们有一个规范化的数据库:

表_1:
customer_id(主键)
国家/地区
城市
街道
房屋号码

表_2:
product_id(主键)
customer_id(外键)
product_storage_building

表_3:
product_id(外键)
产品名称
产品颜色
产品原产地

  1. 但是,假设连接所有三个表的运行时间太长

        SELECT a.*, b.*, c.*
        FROM 
        TABLE_1 AS a
        LEFT JOIN TABLE_2 AS b
        ON a.customer_id = b.customer_id
        LEFT JOIN TABLE_3 AS c
        ON b.product_id = c.product_id
    
    Run Code Online (Sandbox Code Playgroud)

所以我创建了一个新Table_1Table_2

    CREATE OR REPLACE TABLE Denormalized_Data AS
    (
     SELECT customer_id, 
            country, 
            city,
            street, 
            house_number,
            product_id,
            product_storage_building
     FROM Table_1
          LEFT JOIN Table_2
          ON Table_1.cusomter_id = Table_2.customer_id
    )
Run Code Online (Sandbox Code Playgroud)
  1. 然后加入Table_3如下

     SELECT customer_id, 
            country, …
    Run Code Online (Sandbox Code Playgroud)

sql denormalization google-bigquery

4
推荐指数
2
解决办法
2万
查看次数