다 대 다 ( Many To Many Relationship ) 관계를 해소하는 엔티티
ex)고객과 주식은 다 대 다 관계이다.
한명의 고객은 다수의 주식을 매수할 수 있다.
하나의 주식은 다수의 고객에게 매수될 수 있다.
-> 다 대 다 관계는 교차엔티티로 해소한다.
이 경우 교차엔티티를 적용해 고객과 주식의 일반정보외의 교차(연관)정보를 저장하는 테이블을 별도로 만든다.
고객 ---0|<- 배당 ->|0--- 주식
주식 거래 시스템을 구축하고자 한다.
주식 정보는 주식명,주당가격으로 구성된다.
현재 공시된 모든 주식정보는 고객에게 리스트로 제공된다.
고객정보는 아이디,패스워드,이름,주소로 구성된다.
고객이 시스템이 로그인하면 주소와 이름이 화면에 제공된다.
또한 고객은 주식을 매수 또는 매도 할 수 있다.
고객은 주식을 매수하면 배당받은 주식 정보를 주식명,주당가격,보유수량,총액과 같은 형식의 정보를 화면테이블 형태로 제공받을 수 있다.
위 요구사항을 바탕으로 Database Modeling 을 해본다 .
-- 고객 일반 정보
CREATE TABLE customer(
id VARCHAR2(100) PRIMARY KEY,
password VARCHAR2(100) NOT NULL,
name VARCHAR2(100) NOT NULL,
address VARCHAR2(100) NOT NULL
)
-- 주식 일반 정보
CREATE TABLE stock(
symbol VARCHAR2(100) PRIMARY KEY,
price NUMBER NOT NULL
)
-- 고객과 주식의 관계정보 ( 교차엔티티 )
CREATE TABLE shares(
id VARCHAR2(100),
symbol VARCHAR2(100),
quantity NUMBER NOT NULL,
CONSTRAINT erd_shares_pk PRIMARY KEY(id,symbol),
CONSTRAINT erd_customer_fk FOREIGN KEY(id) REFERENCES customer(id),
CONSTRAINT erd_stock_fk FOREIGN KEY(symbol) REFERENCES stock(symbol)
)
-- 고객 등록
INSERT INTO customer(id,password,name,address) VALUES('java','abcd','아이유','오리');
-- 주식 등록
INSERT INTO stock(symbol,price) VALUES('삼성전자',200);
INSERT INTO stock(symbol,price) VALUES('SK텔레콤',150);
INSERT INTO stock(symbol,price) VALUES('기아자동차',250);
COMMIT
-- 배당 등록 : Foreign key 로 id spring 은 Customer 테이블에 존재하지 않으므로 error
INSERT INTO shares(id,symbol,quantity) VALUES('spring','삼성전자',5);
-- FK symbol 현대자동차는 stock 테이블에 존재하지 않으므로 error
INSERT INTO shares(id,symbol,quantity) VALUES('java','현대자동차',1);
-- success
INSERT INTO shares(id,symbol,quantity) VALUES('java','기아자동차',3);
-- success
INSERT INTO shares(id,symbol,quantity) VALUES('java','삼성전자',2);
-- fail : id 와 symbol 복합키 제약조건에 위배
INSERT INTO shares(id,symbol,quantity) VALUES('java','삼성전자',4);
-- 만약 java 아이디 고객이 삼성전자를 4주 더 매수하려 한다면 update 를 해야 한다
UPDATE shares SET quantity=quantity+4 WHERE id='java' AND symbol='삼성전자';
SELECT * FROM customer
SELECT * FROM stock
SELECT * FROM shares
-- java 아이디 고객의 고객명과 보유 주식명과 주당 가격 , 수량 , 총액을 조회
-- customer , shares , stock 3 개 table 을 조인
-- oracle sql
c.name,s.symbol,s.price,sh.quantity,s.price*sh.quantity
FROM customer c,shares sh, stock s
WHERE c.id = sh.id AND sh.symbol = s.symbol
AND c.id='java';
-- ANSI sql
SELECT c.name,s.symbol,s.price,sh.quantity,s.price*sh.quantity
FROM shares sh
INNER JOIN customer c ON c.id=sh.id
INNER JOIN stock s ON sh.symbol=s.symbol
WHERE c.id='java';