我收到一个非规范化的文本文件,必须加载到规范化的表中.
非规范化表:
客户ID - 类别 - 类别2 - 类别3 - 类别4
1 - A - B - C - D.
当这被标准化时,它应该看起来像:
客户ID - 类别
1 - A
1 - B
1 - C
1 - D.
编写T-SQL语句以实现此目的的最佳方法是什么(SQL Server 2008)?
可以使用Oracle Materialized视图来连接具有外键的多个相关表,以创建更大的非规范化大表,并立即刷新吗?
在一些调查中,它表示在使用快速刷新时不允许连接.
我的假设是错误的,我可以用Oracle Materalized视图做这种事情吗?
我正在运行一个开始超越简单性能和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来寻找最新产品.
所有这些都是可能的.你是做什么?你的经验是什么?
非常感谢.
我们有一个关系数据库,其中包含有关我们日常运营的数据。目的是允许用户使用全文本搜索引擎来搜索重要数据。数据经过规范化,因此不是进行全文查询的最佳形式,因此,其想法是对数据的一部分进行规范化,然后将其实时复制到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更改。
我有一个查询,我需要以一种有趣的方式反规范化.
这是来源:
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) 在讨论针对传统RDBMS的NoSQL数据库时,许多文章都说,在NoSQL-DB中,所有相关数据都保存在一起,因此可以避免连接.因此,检索数据更快.简而言之,数据是非规范化的.非规范化也存在缺点.例如冗余,额外空间,需要在多个地方更新数据等
但不论非规范化的利弊是什么; 它是一个DB设计属性.如何将其归因于特定的DB类型?如果在给定的情况下,可以对数据进行非规范化,那么也可以在RDBM中实现相同的数据.
那么为什么将非规范化作为NoSQL db的属性进行讨论呢?
我需要了解如何搜索属于数组的 DynamoDB 的属性。
因此,在对表格进行非规范化时,假设一个人有许多电子邮件地址。我会在 person 表中创建一个数组来存储电子邮件地址。
现在,由于电子邮件地址不是排序键的一部分,如果我需要对电子邮件地址执行搜索以查找人员记录。我需要索引电子邮件属性。
非常感谢!
在我的大学里,我的任务是创建一个简单的大学数据库,其中包含一些表,如学生、部门等。当我处理学生和班级之间的关系时,有一个有趣的时刻,一个学生可以选择多个班级,我被教导要创建带有两个 FK 的第三个表,它应该看起来像这样 Adam(id - 1) 参加了数学课程(id - 5),在第三个表中,记录将是 (1, 5),这里有一个问题为什么我们是否应该更喜欢第三个表而不是数组,对我来说,将学生的班级作为学生表中的附加列看起来更容易。这是一个例子,想象一下学生表(id, name, age, arrayOfClassesID) (1, Adam, 20, [1,8,9,6,7])。
PS这不是我的作业,我已经做过了,但这对我来说真的很有趣
我尝试了两种方法。
方法 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) 过去 20 分钟我一直在阅读有关非规范化的内容,但无法获得带有代码的简洁示例。
这就是非规范化吗?
1.我们有一个规范化的数据库:
表_1:
customer_id(主键)
国家/地区
城市
街道
房屋号码
表_2:
product_id(主键)
customer_id(外键)
product_storage_building
表_3:
product_id(外键)
产品名称
产品颜色
产品原产地
但是,假设连接所有三个表的运行时间太长
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_1表Table_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)
然后加入Table_3如下
SELECT customer_id,
country, …Run Code Online (Sandbox Code Playgroud)denormalization ×10
sql ×4
postgresql ×2
arrays ×1
bigtable ×1
enums ×1
indexing ×1
logstash ×1
mongodb ×1
mysql ×1
nosql ×1
oracle ×1
performance ×1
php ×1
rdbms ×1
sql-server ×1
t-sql ×1