โจ ์ข์ ๊ด๊ณํ ๋ชจ๋ธ ์ค๊ณํ๊ธฐ
1. ๋ชจ๋ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค๊ฐ ์๋์ง ํ์ธ
ํ ํ ์ด๋ธ์ ์๋ ํน์ row์ ๋๋จธ์ง row๋ฅผ ๊ตฌ๋ณํ ์ ์์ด์ผ ํ๋ฏ๋ก ๋ชจ๋ ํ ์ด๋ธ์๋ ์ปฌ๋ผ ํ ๊ฐ ์ด์์ผ๋ก ๊ตฌ์ฑ๋ ๊ธฐ๋ณธํค(PK)๊ฐ ์์ด์ผ ํ๋ค.
- PK๋ row๋ง๋ค ์ ์ผํด์ผํ๋ฏ๋ก null ๊ฐ์ ๊ฐ์ง ์ ์์
- ์์ ์ ์ธ ๊ฐ์ด์ด์ผ ํจ(๊ฐ์ ๊ฐฑ์ ํ ํ์ X)
- ๊ฐ๋ฅํ ํ ๊ฐ๋จํ ํํ์ฌ์ผ ํจ
๐ ์ด๋ฐ ๋ชฉํ๋ฅผ ๋ฌ์ฑํ๋ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ = ์๋ฏธ ์๋ ์ซ์ ๋ฐ์ดํฐ๋ก ์๋ ์์ฑ๋๋ ์ปฌ๋ผ
- ์ฐธ์กฐ ๋ฌด๊ฒฐ์ฑ์ ์ค์ํ๋ค = null์ด ์๋ ์ธ๋ํค(FK)๊ฐ ์ค์ ๋ ์์ ํ ์ด๋ธ์ ๊ฐ ๋ ์ฝ๋์ ์ผ์นํ๋ ๋ ์ฝ๋๊ฐ ๋ถ๋ชจ ํ ์ด๋ธ์ ์กด์ฌํจ
- ๋ณตํฉ ๊ธฐ๋ณธํค๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์
- PK๋ฅผ ์ ์ํ ๋ ๋๋ถ๋ถ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ ํด๋น ์ปฌ๋ผ์ ์ ์ผ ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ด ๋ง๋ ๋ค. ์ปฌ๋ผ ๋ ๊ฐ ์ด์์ ์ ์ผ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ ์ด ํ ์ผ๋ง ๋ ๋ง์์ง
- ์ผ๋ฐ์ ์ผ๋ก PK๋ก ์กฐ์ธ์ ์ํํ๋๋ฐ, PK๊ฐ ์ฌ๋ฌ ์ปฌ๋ผ์ผ๋ก ๊ตฌ์ฑ๋์ด์์ผ๋ฉด ์ฟผ๋ฆฌ๊ฐ ์ข ๋ ๋ณต์กํด์ง๊ณ ๋๋ ค์ง
๐ ๋ณตํฉ ๊ธฐ๋ณธํค์ ์ฅ์ ์ ์ถํ์ ์ ๋ฆฌ ..!
2. ์ค๋ณต์ผ๋ก ์ ์ฅ๋ ๋ฐ์ดํฐ ํญ๋ชฉ ์ ๊ฑฐ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทํ์ ๋ชฉํ = ์ค๋ณต ๋ฐ์ดํฐ ์ ๊ฑฐํด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฌ์ฉ๋๋ ์์ ์ต์ํ
์ฌ์ฉ์๊ฐ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ํ ๊ตฐ๋ฐ ์ด์์์ ์ ๋ ฅํ์ง ์๋๋ก ํจ
- ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๋ฉด ๋น์ ์์ ์ธ ์ฝ์ , ๊ฐฑ์ , ์ญ์ ๋ฅผ ๋ง์ ์ ์์
- ์ผ๊ด์ฑ ์๋ ๋ฐ์ดํฐ ๋ฐ์์ ์ต์ํํ ์ ์์
3. ๋ฐ๋ณต ๊ทธ๋ฃน ์ ๊ฑฐ
๋ฐ๋ณต ๊ทธ๋ฃน์ ์ฒ๋ฆฌํ ๋ UNION ์ฟผ๋ฆฌ ์ฌ์ฉ ๐ ์ฝ๊ธฐ ์ ์ฉ ๋ทฐ๋ฅผ ๋ง๋ค์ด ๋ฐ์ดํฐ ์ ๊ทํ
4. ์ปฌ๋ผ๋น ํ๋์ ํน์ฑ๋ง ์ ์ฅ
๊ฒ์์ ํ๊ฑฐ๋ ๊ฐ์ ์ง๊ณํ ๋ ํน์ฑ ๊ฐ์ ๋ถ๋ฆฌํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ !
- ์ฃผ์๋ ์ ํ๋ฒํธ ๊ฐ์ ์ปฌ๋ผ์ ๋ฐ์ดํฐ ์ผ๋ถ๋ฅผ ๊ฑธ๋ฌ๋ด๋ ค๋ฉด ์ต์ ์์ค์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ผ๋ก ๋ถํ
- ๋ณด๊ณ ์๋ ๋ชฉ๋ก์ ๋ฝ์ผ๋ ค๊ณ ํน์ฑ๋ค์ ์ฌ๊ฒฐํฉํ ๋๋ SQL์ ๋ฌธ์์ด ์ฐ๊ฒฐ ๊ธฐ๋ฅ์ ์ฌ์ฉ
5. ๊ณ์ฐ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด ์ ์ข์ง ์์์ง ์ดํด
CREATE TABLE Orders(
OrderNumber int NOT NULL,
OrderDate date NULL,
ShipDate date NULL,
CustomerID int NULL,
EmployeeID int NULL,
OrderTotal decimal(15, 2) NULL
);
๐ OrderTotal ์ปฌ๋ผ์ ๋๋ ๊ฒ์ด ์ข์ ๊ฑธ๊น...?
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฑ๋ฅ์ ์ฌ๊ฐํ ์ํฅ ๋ฏธ์นจ
- ํ ์ด๋ธ์ row๊ฐ ๋ณ๊ฒฝ, ์ฝ์ , ์ญ์ ๋ ๋๋ง๋ค ๊ฐ์ ์ฌ๊ณ์ฐํด์ผํ๋ฏ๋ก ๋ฐ์ดํฐ ๋ฌด๊ฒฐ์ฑ์ ์ ์งํ๊ธฐ ์ด๋ ค์
โด๏ธ ์ฌ์ฉ ๋ฐฉ๋ฒ
- AS ํค์๋ ๋ค์์ ์ํํ ๊ณ์ฐ ์ ์ํด์ ์ฒ๋ฆฌ ๊ฐ๋ฅ
CREATE FUNCTION dbo.getOrderTotal(@orderId int)
RETURNS money
AS
BEGIN
DECLARE @r money
SELECT @r = SUM(Quantity * Price)
FROM Order_Details WHERE OrderNumber = @orderId
RETURN @r;
END;
GO
CREATE TABLE Orders(
OrderNumber int NOT NULL,
OrderDate date NULL,
ShipDate date NULL,
CustomerID int NULL,
EmployeeID int NULL,
OrderTotal money AS dbo.getOrderTotal(OrderNumber)
);
- GENERATED ํค์๋ ์ฌ์ฉ
-- ํ
์ด๋ธ์ ๋ณ๊ฒฝํ๋ ค๊ณ INTEGRITY ์ต์
์ ๋
SET INTEGRITY FOR Order_Details OFF;
-- ํํ์์ ์ฌ์ฉํด ๊ณ์ฐ ์ปฌ๋ผ์ ์์ฑํจ
ALTER TABLE Order_Details
ADD COLUMN ExtendedPrice decimal(15, 2)
GENERATED ALWAYS AS (QuantityOrdered * QuotedPrice);
-- INTEGRITY ์ต์
์ ๋ค์ ์ผฌ
SET INTEGRITY FOR Order_Details
IMMEDIATE CHECKED FORCE GENERATED;
-- ๊ณ์ฐ ์ปฌ๋ผ์ ์ธ๋ฑ์ค ์์ฑ
CREATE INDEX Order_Details_ExtendedPrice
ON Order_Details(ExtendedPrice);
CREATE TABLE Order_Details(
OrderNumber int NOT NULL,
ProductNumber int NOT NULL,
QuotedPrice decimal(15, 2) DEFAULT 0 NULL,
QuantityOrdered smallint DEFAULT 0 NULL,
ExtendedPrice decimal(15, 2)
GENERATED ALWAYS AS (QuotedPrice * QuantityOrdered)
);
๐ ๊ณ์ฐ ์ปฌ๋ผ์ ๋ง๋ ์ธ๋ฑ์ค๋ฅผ ํตํด ํด๊ฒฐํ๊ธฐ๋ ํจ
๐ ์ธ๋ฑ์ค ์ ์ฉ์ด ์ด๋ ค์ธ ๋๋ ํ ์ด๋ธ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํด ๋๋ ๋ฐฉ๋ฒ ๋์ ๋ทฐ๋ฅผ ์ด์ฉํด ์ํํ ๊ณ์ฐ ์ ์