교차 엔티티 ( Intersection Entity or Association Entity 제휴 엔티티 )

기록하는 용도·2022년 9월 18일
0

교차 엔티티 (Intersection Entity or Association Entity 제휴 엔티티)

다 대 다 ( 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';

0개의 댓글