database.sarang.net
UserID
Passwd
Database
DBMS
ㆍMySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MySQL Q&A 29564 게시물 읽기
No. 29564
모델링 - 테이블/엔티티 통합에 대해 문의드립니다.
작성자
pithecus(pithecus)
작성일
2010-03-03 13:58
조회수
7,006

안녕하세요.

쇼핑몰 db 를 설계하던 중에 어떻게 해결해야 할 지 모르겠어서 문의드립니다.

 

고객이 주문을 하면 배송을 해야 합니다.

그런데 만약 고객이 취소를 하거나 교환을 원할 경우에도 배송을 해줘야 합니다.

 

그래서 테이블이 4개 - 주문, 교환, 취소, 배송 - 가 있습니다.

교환,취소,배송 테이블은 주문 테이블을 참조합니다. (한번의 주문에서 여러번의 교환,취소,배송이 발생할 수 있습니다) 

 

CREATE TABLE 주문 (주문 id int PK);

CREATE TABLE 교환 (교환 id int PK, 주문id FK);

CREATE TABLE 취소 (취소id int PK, 주문id FK);

CREATE TABLE 배송 (배송id int PK, 주문id FK);

 

문제는 교환이나 취소의 경우에도 배송정보가 있어야 하는데 어떻게 관계를 설정해야 할 지 모르겠네요.

생각1: 주문,교환,취소를 가지고 슈퍼타입을 만들 생각도 했지만 겹치는 필드가 거의 없고 형식적으로 만드는 것이 아닌가 의문이 듭니다.

생각2: 배송 테이블에 주문id, 교환id, 취소id 를 전부 만드는 것을 생각해봤습니다.

 

이런 경우를 해결하신 분이 있으시면 알려주시면 감사하겠습니다 ;)

이 글에 대한 댓글이 총 2건 있습니다.

안녕하세요 박성원입니다.

먼저 테이블 설계는 사람마다 다르며 system이나 DBMS별로 최적화를 유도해내는 부분에 대해서

모두 다르기때문에 딱히 어느게 답이다 라고 말씀드리기 힘든 부분이라고 언급드리며 답변 드리도록

하겠습니다.

 

말씀하신 부분은 비정규화의 하나의 부분으로 취소, 교환, 배송 등을 조회 할때마다 주문테이블을

JOIN해야하는 사태를 미연에 방지하고자 이미 DATA가 들어잇는 주소 필드를 여러테이블에 걸쳐

동일하게 입력하는 방법입니다. 사실 이런식으로 만들어도 무방합니다만 많은 부분에 걸쳐서

동일한 DATA가 기록되기때문에 비효율적인 구조를 가집니다.

 

사실 쇼핑몰 DATABASE는 만든적이 없지만

만약 저라면

 

User : 회원 테이블 (UserID(PK), Name, UAddress, Tel... 등 신상정보)

Order : 주문 테이블 (ODID(PK), FromID(User.UserID), ODFlag(ODFlagInfo.FlagID), DAddress.... 등 주문 정보)

ODFlagInfo : 식별값 정보 (FlagID(PK), Info) -- 배송, 취소, 주문 등의 Flag 값 정보

Order_UpdateLog : 주문 변경 Log (ODID(Order.ODID), DATE, UpdateInfo 등 변경 내역저장)

 

이렇게 만들어 볼까합니다.

 

간단히 언급을 드리자만

 

한번의 주문에서 여러번의 교환, 취소, 배송이 일어난다해도 간단히 Flag 값만 Update 해주는 것만으로

쉽게 수정이 가능합니다.

또한 수정과 동시에 수정 사유와 변경 이력등의 내역을 Order_UpdateLog 테이블에 저장하기 때문에

쉽게 변경 내역을 추적할 수 있습니다.

 

해결한적은 없지만 이렇게 하면될듯하네요 ^^;;

 

그럼 건승하시길 ^0^

박성원(darkancia)님이 2010-03-05 10:28에 작성한 댓글입니다.
이 댓글은 2010-03-05 10:36에 마지막으로 수정되었습니다.

 댓글에서 얘기 주신대로 

주문 테이블에 모든 주문관련 요청 (주문, 교환, 취소 등) 을 받고

각 요청의 세부정보는 별도의 테이블로 만들어서 관리를 하는 것이 좋다고 판단했습니다.

여러가지 고민을 계속 해봤는데 위의 방법이 가장 적합해 보이네요.

의견 주셔서 감사합니다 ;)

pithecus(pithecus)님이 2010-03-11 11:26에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
29567informix--> mysql [1]
ㅇㅇ
2010-03-08
6223
29566InnoDB에는 index 가 안걸리나요? [3]
박종선
2010-03-04
6625
29565join 속도 문제 [1]
박종선
2010-03-04
6984
29564모델링 - 테이블/엔티티 통합에 대해 문의드립니다. [2]
pithecus
2010-03-03
7006
29563mysql 업그레이드 [1]
이하사
2010-02-26
7351
29561한글 입력 문제.
유기양
2010-02-26
7469
29560용량이 큰 db를 백업할때는 어떻게 해야 좋을까요? [1]
이훈
2010-02-25
7025
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.4로 자료를 관리합니다