2011-02-27 45 views
4

我想知道是否有人对如何正常化数据库有任何建议。现在,我不是指设计结构,而是指如何将数据库数据从旧结构实际移动到新的规范化结构。我知道我可以写一些类似于PHP脚本的东西,但我想知道是否有办法在SQL中执行此操作。特别是MySQL。如何正常化SQL数据库

**编辑:有没有人尝试过类似SwisSQL?这是一个迁移工具,但我不确定它是否会按照我的要求去做。

+1

我不相信你在找这个答案。数据库结构是由用户创建的,因为我们是知道最终如何使用数据的人,所以我们做出了合理的决定。所创建的system/db_structure基于用户的偏好,存储此信息的最佳方式是什么。您可能想要熟悉诸如“CREATE TABLE new_table SELECT * FROM old_table”之类的查询等。 – Duniyadnd 2011-02-27 20:59:30

+0

您的问题实际上是关于从旧的低效架构迁移到新的规范化架构,而不是关于_normalization_正确。考虑编辑你的问题的标题。 – 9000 2011-02-27 21:04:07

+0

@ 9000是的,我的意思是迁移 – LordZardeck 2011-02-27 21:17:51

回答

8

这里是正常化脚本表的实例。我建议你做这样的事情

e.g Table: tbl_tmpData 
Date, ProductName, ProductCode, ProductType, MarketDescription, Units, Value 
2010-01-01, 'Arnotts Biscuits', '01', 'Biscuit', 'Store 1', 20, 20.00 
2010-01-02, 'Arnotts Biscuits', '01', 'Biscuit', 'Store 2', 40, 40.00 
2010-01-03, 'Arnotts Biscuits', '01', 'Biscuit', 'Store 3', 40, 40.00 
2010-01-01, 'Cola', '02', 'Drink', 'Store 1', 40, 80.00 
2010-01-02, 'Cola', '02', 'Drink', 'Store 2', 20, 40.00 
2010-01-03, 'Cola', '02', 'Drink', 'Store 2', 60, 120.00 
2010-01-01, 'Simiri Gum', '03', 'Gum', 'Store 1', 40, 80.00 
2010-01-02, 'Simiri Gum', '03', 'Gum', 'Store 2', 20, 40.00 
2010-01-03, 'Simiri Gum', '03', 'Gum', 'Store 3', 60, 120.00 

你会先创建日期表:

CREATE TABLE tbl_Date 
(
DateID int PRIMARY KEY IDENTITY(1,1) 
,DateValue datetime 
) 

INSERT INTO tbl_Date (DateValue) 
SELECT DISTINCT Date 
FROM tbl_Data 
WHERE Date NOT IN (SELECT DISTINCT DateValue FROM tbl_Date) 

那么您需要创建您的市场表

CREATE TABLE tbl_Market 
(
MarketID int PRIMARY KEY IDENTITY(1,1) 
,MarketName varchar(200) 
) 

INSERT INTO tbl_Market (MarketName) 
SELECT DISTINCT MarketDescription 
FROM tbl_tmpData 
WHERE MarketName NOT IN (SELECT DISTINCT MarketDescription FROM tbl_Market) 

那么您需要创建ProductType表

CREATE TABLE tbl_ProductType 
(
ProductTypeID int PRIMARY KEY IDENTITY(1,1) 
,ProductType varchar(200) 
) 

INSERT INTO tbl_ProductType (ProductType) 
SELECT DISTINCT ProductType 
FROM tbl_tmpData 
WHERE ProductType NOT IN (SELECT DISTINCT ProductType FROM tbl_ProductType) 

那么你会创建您的产品表

CREATE TABLE tbl_Product 
(
ProductID int PRIMARY KEY IDENTITY(1,1) 
, ProductCode varchar(100) 
, ProductDescription varchar(300) 
,ProductType int 
) 

INSERT INTO tbl_Product (ProductCode, ProductDescription, ProductType) 
SELECT DISTINCT tmp.ProductCode,tmp.ProductName, pt.ProductType 
FROM tbl_tmpData tmp 
INNER JOIN tbl_ProductType pt ON tmp.ProductType = pt.ProductType 
WHERE ProductCode NOT IN (SELECT DISTINCT ProductCode FROM tbl_Product) 

那么你会创建自己的数据表

CREATE TABLE tbl_Data 
(
DataID int PRIMARY KEY IDENTITY(1,1) 
, DateID varchar(100) 
, ProductID varchar(100) 
, MarketID varchar(300) 
,Units decimal(10,5) 
, value decimal(10,5) 
) 


INSERT INTO tbl_Data (ProductID, MarketID, Units, Value) 
SELECT t.DateID 
     , p.ProductID 
     , m.MarketID 
     , SUM(tmp.Units) 
     , SUM(tmp.VALUE) 
FROM tbl_tmpData tmp 
INNER JOIN tbl_Date t ON tmp.Date = t.DateValue 
INNER JOIN tbl_Product p ON tmp.ProductCode = p.ProductCode 
INNER JOIN tbl_Market m ON tmp.MarketDescription = m.MarketName 
GROUP BY t.DateID, p.ProductID, m.MarketID 
ORDER BY t.DateID, p.ProductID, m.MarketID 
+0

没有任何问题,在所有的队友!我强烈建议编写一个脚本。在上面的时尚而不是试图创造意见。 – 2011-02-28 00:05:38

+0

好的,这是我想要领导的方向,但如果主键发生了变化呢?例如,在我的情况下,我的1表基本上被拆分为2.另一个表依赖于拆分之前的原始表,现在依赖于拆分中的2表。 – LordZardeck 2011-02-28 13:18:30

+0

@LordZardeck,你可以发表一些你想要规范化的表格的例子,并且看看我能做些什么来让你走向正确的方向。 – 2011-02-28 20:33:28

0

从MySQL网站 下载MySQL Workbench和那么你的MySQL实例连接到工作台UI Utitily。

一旦完成。

编写一个脚本,将您的数据转换成你想所需的结构。

+0

是的,我希望能够逃脱SCRIPTS,并能够直接在SQL中做到这一点,但我想这是不可能的。 :P – LordZardeck 2011-02-27 21:22:41

+0

理想情况下,如果您正在进行某种迁移,您将执行ETL(Extract - > Transform - > Load),则首先需要做的是以特定方式提取数据。我不能看到你如何能够用脚本来完成这个任务,但是你可以在MYSQL中使用Views来创建一个视图来为你完成这个转换,然后你可以运行一个简单的查询来将所有的数据插入到你的其他表格。 – 2011-02-27 21:30:18

+0

你可以给我的任何例子吗? – LordZardeck 2011-02-27 21:35:21

0

我最近做这一点,并有一定的见解中的通用程序如何执行。

  1. 从模型化数据开始。当你从一个没有标准化的数据库开始时,你需要创建一个你想要传输数据的合适的模型。这包括识别应该存在于自己的表中的原子对象。识别重复的数据并确定应该去的地方。还要确定存在于您的数据结构中的所有关系。

    可选步骤。数据库通常与可能还需要更新的接口一起使用。在这个步骤中也要看这个设计,并决定在数据结构和接口程序中是否有可以等待的隔离部分。应包含多少由实际方面决定,如时间和预算。也许有些部分不需要修改。

    它也可以是一种选择从头开始完全跳过向后兼容性,让那里是两个平行的系统

  2. 写脚本,将所有新的列和表的标准化的数据要求。

  3. 再写剧本了非规范化的数据转移到新的标准化数据结构。这是我想说的最棘手的部分,而且可能相当混乱,这取决于旧数据的形状有多糟糕。

  4. 通过向新的表格和列添加约束来强制执行新规范化数据上模型的所有约束。这也最好在脚本中完成。她会看到您的数据迁移是否成功。如果确实如此,您将能够添加所有约束。如果失败了,一些限制就会失败,你将不得不回头看看失败的原因。

  5. 最后,制作另一个脚本,删除新模型中删除的所有列和表。通过这样做,您可以轻松识别需要更新的界面中的所有位置。任何与这些列和表中的任何内容交谈的内容都必须在界面中更新。

一些常规技巧是针对数据库的一个可能减少的副本进行所有开发。例如。在MySQL中,您可以使用Workbench来执行SQL转储,并测试您的脚本。在迁移工作之前,您可能需要对数据库进行一些迭代。就此而言,还要对数据库副本进行实际迁移,而不是在生产中破坏任何东西。