我想知道是否有人对如何规范化数据库有任何建议。现在,我并不是指设计结构,我的意思是如何将数据库数据从旧结构实际移动到新的标准化结构。我知道我可以编写类似PHP脚本的东西,但我想知道是否有办法在SQL中执行此操作。特别是MySQL。
**编辑:有没有人尝试像SwisSQL这样的东西?这是一个迁移工具,但我不确定它是否能满足我的要求。
答案 0 :(得分: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
答案 1 :(得分:0)
从MySql网站下载MySQL Workbench 然后将您的MySQL实例Utitily连接到Workbench UI。
一旦完成。
编写一个脚本,将您的数据转换为您想要的所需结构。
答案 2 :(得分:0)
我最近这样做了,并对如何执行一般程序有一些见解。
首先为数据建模。当您从未规范化的数据库开始时,您需要创建一个要将数据传输到的正确模型。这包括识别应该存在于自己的表中的原子对象。识别重复数据并确定应该去哪里。还要确定数据结构中存在的所有关系。
可选步骤。数据库通常与可能还需要更新的接口一起使用。在此步骤中查看该设计,并确定是否存在可以在数据结构和接口程序中等待的任何隔离部件。应包括多少取决于实际方面,如时间和预算。也许有些部分还不需要修改。
它也可以是从头开始完全启动,跳过向后兼容性并让两个并行系统
编写一个脚本,添加规范化数据所需的所有新列和表。
编写另一个脚本,将非规范化数据传输到新的规范化数据结构。这是我要说的最棘手的部分,并且可能相当混乱,这取决于旧数据的形状有多糟糕。
通过向新表和列添加约束,在新规范化数据上强制执行模型中的所有约束。这也最好在脚本中完成。她将会看到您的数据迁移是否成功。如果是,您将能够添加所有约束。如果失败,某些约束将失败,您将不得不返回并查看失败的内容。
最后,制作另一个脚本,删除在新模型中删除的所有列和表。通过这样做,您可以轻松识别界面中需要更新的所有位置。任何与这些列和表中的任何内容交谈的内容都必须在界面中进行更新。
一些一般提示是针对数据库的副本进行所有开发,可能还原。例如。在MySQL中,您可以使用Workbench进行SQL转储,并在其上测试脚本。在迁移工作之前,您可能需要对数据库进行一些迭代。在连接中,还要对数据库的副本进行实际迁移,而不是破坏生产中的任何内容。