반응형
누군가 데이터베이스를 정규화하는 방법에 대한 제안이 있는지 궁금합니다. 이제 구조를 설계하는 것이 아니라 실제로 데이터베이스 데이터를 이전 구조에서 새로운 정규화 된 구조로 이동하는 방법을 의미합니다. 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
참조 페이지 https://stackoverflow.com/questions/5135889
반응형
'MySql' 카테고리의 다른 글
MySQL 동일한 쿼리에서 두 개의 열을 계산할 수 있습니까? (0) | 2020.10.16 |
---|---|
MySQL 기본값 인 NULL을 사용하는 것이 좋습니까? (0) | 2020.10.16 |
MySQL Windows 호스트에서 브리지 네트워크 내에있는 Docker 컨테이너의 IP 주소를 얻는 방법은 무엇입니까? (0) | 2020.10.16 |
MySQL 스프링 부트가 데이터 소스 (mysql)에서 JDBC URL을 확인할 수 없습니다. (0) | 2020.10.16 |
MySQL 자동차 대리점을위한 데이터베이스 설계 (0) | 2020.10.16 |
댓글