如何规范化SQL数据库

我想知道是否有人对如何规范化数据库有任何建议。现在,我不是要设计结构,而是要实际将数据库数据从旧结构移动到新的规范化结构。我知道我可以编写类似PHP脚本的内容,但是我想知道是否有一种方法可以在SQL中进行。特别是MySQL。

**编辑:有人尝试过SwisSQL吗?这是一个迁移工具,但我不确定它是否能满足我的要求。

回答:

这是在脚本中标准化表的示例。我建议你做这样的事情

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

以上是 如何规范化SQL数据库 的全部内容, 来源链接: utcz.com/qa/425562.html

回到顶部