C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[58536] POS프로그램 DB설계관련 질문입니다.
skjoon [skjoon] 2070 읽음    2009-09-15 00:12
파이어버드 게시판에 올릴까하다가.. Firebird에 한정된 내용이 아니라 판단되어서 이곳에 올립니다.

C++Builder/파이어버드를 이용해서 POS프로그램을 만들고 있습니다.
개인적으로 진행하는 것으로 단독형이라 규모가 그리 크진 않습니다만
나중에 혹시라도 pos단말기를 여러개 묶어서 네트워크 형태로 업그레이드를 할지도 모르겠다는 생각이 들어 고민을 하고 있습니다. ^^;;
거의 완성단계라고 생각하고 있었는데.. 이런 문제를 만나니 더 진행하기가 힘드네요. 주변이 다 기계/통신쪽이라 물어볼 곳도 마땅치 않고.. ^^;;

상품을 판매하게 되면 판매한 내역을 DB에 남겨야 하는데,
저는 테이블을 다음과 같이 만들었습니다.
워낙 이쪽으로는 경험이 없어 제 나름대로 만든 것입니다.
혹시 이런 구성에 문제가 있거나 좋은 방법을 알고 계신 분들 도움 조언 부탁드립니다. ^^

------------------------------------

// 상품정보 마스터 테이블입니다.
CREATE TABLE ITEMS (
    ITEM_CODE        INTEGER NOT NULL, // PK
    ITEM_NAME        VARCHAR(50) NOT NULL,
    BARCODE          VARCHAR(15), // 차후에 크기를 늘릴 예정입니다.
    MFR_CODE         INTEGER,
    REG_DATE         DATE,
    SUPPLIER_CODE    INTEGER,
    ITEMCATE_CODE    INTEGER,
    CNSM_PRICE       INTEGER,
    COST_PRICE       INTEGER,
    SAVEPOLICY_CODE  INTEGER,
    DCPOLICY_CODE    INTEGER,
    BOXITEM_FLAG     CHAR(1)
);
// 바코드정보로 PK를 잡을까 하다가 바코드가 없는 상품도 있으니까 ITEM_CODE 필드를 만들었습니다.
ALTER TABLE ITEMS ADD CONSTRAINT PK_ITEMS PRIMARY KEY (ITEM_CODE);

// 판매내역 테이블입니다.
// 기존에 CART_CODE 필드를 자동증가하는 Integer로 잡았었습니다.
// 현재는 년월일(8)+단말기코드(3)+단말기-일별 일련번호(4) 이렇게 15바이트로 잡았습니다.
CREATE TABLE CARTS (
    CART_CODE   CHAR(20) NOT NULL,
    OCCUR_TIME  TIMESTAMP NOT NULL,
    PAYMENT     CHAR(1) NOT NULL // 결제되었는지 여부를 나타냅니다.
);
ALTER TABLE CARTS ADD CONSTRAINT PK_CARTS PRIMARY KEY (CART_CODE);

// 결제타입 구분정보 테이블입니다.
// 사용자가 결제타입정보를 추가할 수 있도록 PAYTYPES라는 테이블을 별도로 두었습니다.
CREATE TABLE PAYMENTS (
    CART_CODE     CHAR(20) NOT NULL,
    PAYTYPE_CODE  INTEGER NOT NULL, // PAYTYPES라는 테이블에 여러 결제수단(현금/카드 등..) 정보가 들어있습니다.
    PAY_SUM       INTEGER NOT NULL // 판매 총액
);
ALTER TABLE PAYMENTS ADD CONSTRAINT PK_PAYMENTS PRIMARY KEY (CART_CODE, PAYTYPE_CODE);

// 판매 상세내역 테이블입니다.
CREATE TABLE SELLITEMS (
    CART_CODE     CHAR(20) NOT NULL, // FK
    ITEM_CODE     INTEGER NOT NULL, // FK
    ITEM_COUNT    INTEGER NOT NULL,
    ITEM_PRICE    INTEGER NOT NULL,
    DISCOUNT_SUM  INTEGER NOT NULL
);
ALTER TABLE SELLITEMS ADD CONSTRAINT PK_SELLITEMS PRIMARY KEY (CART_CODE, ITEM_CODE);

------------------------------------

여기에서 저의 고민은 과연 판매내역 PK를 이렇게 잡는 것이 올바른 것인지,
그리고 문제가 없다는 가정하에 단말기/일별 일련번호는 어떻게 만드는지입니다.
처음에는 판매내역의 CART_CODE를 '년월일시분초+단말기코드' 이렇게 하려고 하다가..
POS단말기의 로컬시간을 누군가가 바꿔버릴 수도 있다는 점과
아무래도 이런것은 DB서버에서 트리거 등에서 만들어줘야 하지 않을까 하는 생각에 고민을 하고 있습니다.

아버지가 운영하시는 작은 슈퍼에 놓아드릴 생각으로 가볍게 시작했는데,
개인적으로 진행하다보니 기간이 계속 늘어지고 해서  대충 쉽게 갈까 하다가
기왕 만드는 거 공부하는 셈치고 제대로 해보자 하는 생각에 이렇게 질문까지 하고 있습니다. ^^;;

// 요약
1. 위의 테이블들을 보시고 조언 부탁드립니다.
2. 판매내역의 코드를 보통 어떻게 만들어 쓰시는지 궁금합니다. 알려주세요.

-------------------

# JBMAX님 지난번 보내주신 마스터정보 정말 고마웠습니다. ^^;;

+ -

관련 글 리스트
58536 POS프로그램 DB설계관련 질문입니다. skjoon 2070 2009/09/15
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.