개이득인개발
544
2018-07-12 23:37:29
10
152

디비 구축중인데 테이블 간에 관계 외래키 설정 평가부탁드립니다.


수정하고 보완하고를 계속 반복하며 구축중인데요 포트폴리오 용으로 쇼핑몰 비슷한 걸 만들고 있습니다.

전체적인 흐름은 회원이 장바구니에 여러 상품을 담을수있으며 주문서를 작성후 주문을 완료하면 회원에게 다시 주문내역을 보여주는 시스템입니다. (배송관련 기능은 없습니다.)


회원테이블

첨부 이미지

아이디가 키 이며 회원 마스터 테이블입니다.


상품테이블

첨부 이미지


상품번호가 키 이며 상품 마스터 테이블입니다.



상품테이블 분리

첨부 이미지


상품테이블의 분리한 형태이며 상품 테이블과 1:n 관계이며 재고 , 단가등  수량과 연동 되는 테이블입니다.



장바구니 테이블

첨부 이미지


회원 , 상품 테이블 의 외래키로 정보를 가져와서 화면에 사용자에게 정보를 제공하고 수량을 저장합니다.



주문테이블

첨부 이미지

 

주문번호가 키이며 회원 , 상품 테이블 의 외래키를 가지며 주문헤더부분엔 사용자 정보 센터엔 상품정보와 결제 방식이 있으며 주문을 성공하고 주문내역으로 사용자에게 제공하는 테이블입니다.


일단 이렇게 구축했는데 피드백 지적 보완사항 대환영입니다.

0
0
  • 답변 10

  • Spring_GTX
    131
    2018-07-13 00:17:10 작성 2018-07-13 00:32:42 수정됨

    고수님들이 아니라서 db를 어떻게 구성할지는 잘 모르지만,,, 제 생각을 적어보자면,


    * 계정과 권한(등급)이 1:1 매칭이고 권한에 따른 할인률이 변동이 있을 수 있는 상황이 있다면 따로 권한 테이블을 만들고 회원테이블에 권한 id를 외래키로 놓는게 좋겠고

    1:1이 아니라면 그냥 따로 만들어야겠죠..


    * 상품테이블에 이미지가 url인지 아니면 이미지를 db에 넣은 건지 잘 모르겠지만, 후자라면 테이블 두시길 권장합니다..


    * 상품 테이블, 상품테이블 분리가 의미가 있는지는 모르겠네요, 이렇게 분리를 해서 관리하는 타입이라면 회원쪽 테이블에서도 아이디, 비번만 냅두고 회원정보 따로 권한 따로 분리해서 사용 할 법도 한데요,,, 굳이 나누지 않아도 된다면 나누지 않아도 괜찮습니다만, 자주 값이 변경 되는 값이 있다면 분리해도 되겠지요, 상황에 맞게 쓰시면 될 듯 싶습니다..


    * 주문 테이블에 사용자 정보가 들어갈 필요가 있을까요?,,, 상품 정보도 필요없다고 생각됩니다.

    제가 테이블 구성할 때에는 중첩되어 저장되는 값이 없도록, 나중에 귀찮더라도 쿼리문을 좀 짜서

    셀렉 하는 편이라서요;


    주문번호(auto id) | 회원 아이디(외래키) | 상품번호(외래키) | 주문수량 | 결제타입 | create_date

    이정도로 테이블을 구성할 것 같아요

    셀렉해서 구할 수 있는 값(총금액)을 db 컬럼을 만들어서 저장하지 않는 편이라서요;

    등급이 도중에 변경될 수 있고 그로인해 할인율이 변경될 수 있다면 할인율과 총금액은 넣는게 맞겠네요

    기록상으로 어떤 등급일 때  얼마의 할인을 받아서 결제된 금액이 얼마인지는 확인해야하니깐요


    * 주문 테이블에서 한명이 동일한 시간에 한가지로만 구매하는게 아니고 여러가지를 시킨다면 따로 두셔야할 것 같아요

    주문번호(auto id) | 회원 아이디(외래키) | 결제타입 | create_date | (총 주문 금액 있거나 없거나..)

    주문번호(외래키) | 상품번호(외래키) | 주문수량

    0
  • sspkos
    84
    2018-07-13 00:21:28 작성 2018-07-13 00:27:05 수정됨

    1. 일단 상품테이블 분리하셨다고 했는데(1:N)

       현재 그림상 1:1의 관계로 보입니다.(분리된 상품테이블의 키로 활용되는건 상품번호 외는 없어보임)

        즉 하나의 상품의 단가/재고 일 뿐이죠  --- 통합이 되어야 될거 같습니다.(현재 그림기준)

    2.주문테이블

      설명하셨듯이 주문헤드와 주문내역으로 분리 된거 같은데

      현재 주문(내역)테이블의 키가 "주문번호"라는것은 좀 이상합니다.


    만약 회원아이디 TEST01이 주문을 할때 비빔밥도 사고, 불고기 뚝배기도사고, 짜장면도 주문한다면

    현재 테이블 논리로서는 맞지 않을거 같습니다.

    키가 주문번호 + 시리얼넘버 ?  주문번호+상품번호?  이렇게 가져가야 될거 같습니다.

    그리고, 회원 ID,고객명,메일,주문일자, 결제방법등은 주문헤드 테이블로 이전하셔야 될거 같구요


    즉, 주문헤드 테이블 (키:주문번호)

         주문테이블(키:주문번호+SER_NO 혹은 주문번호+상품번호) 로 구분이 되어야 될거 같은데.... 의도하시는것이 맞는지 ....
    0
  • 개이득인개발
    544
    2018-07-13 09:22:25 작성 2018-07-13 09:26:08 수정됨

    sspkos

    저도 주문테이블에서 한 회원이 여러상품을 주문했을경우 어떻게 처리할지 고민이었는데  복합키를 사용하면되는군요? 그리고 상품테이블에선 자주변경되는 사항은 쓸데없는 트랜잭션을 일으켜서 분리하는게 낫다고하는데 합쳐도 상관없는건가요?

    그리고 주문헤드 테이블을 별도로 두라고 하셧는데요 좀더 자세한 설명부탁드립니다 한번도 구축해본적없어서 하나부터 열까지 다몰라용 ㅋㅋ

    0
  • 개이득인개발
    544
    2018-07-13 09:27:30 작성 2018-07-13 09:29:50 수정됨

    Spring_GTX

    주문테이블에 사용자 정보를 안넣으면 주문한 내역은 어디에다 저장이되는거에요? 잘몰라서요.. 저는 주문테이블이 주문서 작성과 동시에 디비에 저장되 주문내역으로 사용자에게 필요한 정보만 제공할까하는데 틀린방법인가요?

    주문은 한명이 여러개를 할수있는데 테이블을 따로따로 셋팅하라는 말씀이신가요?

    0
  • sspkos
    84
    2018-07-13 09:36:52 작성 2018-07-13 09:50:49 수정됨

    실제로 1:1 관계의 테이블에서 빈번한 트랜잭션이 일어난다고 테이블을 분리하는건 좀....

    안되는건 아니지만 상품이 하나입력할때 분리된 상품테이블에도 동시에 등록해야 되지 않을까요?

    관리해야할 컬럼이 너무 많은경우 관련업무영역에 따라 분리해서 운영을 하기도 합니다 만 머...


    예를들어 1:1테이블이지만 일반 부서에서 일반적으로 사용되는 컬럼들과 계약부서에서

    사용하는 보안사항(계약금액, 계약내용등)이 필요한 컬럼들을 필요에 의해 분리해서 테이블을

    분리하는 경우는 있습니다.

    우리가 정규화를 하는 목적은 크게 데이타의 중복 발생을 막고 효율적 관리의 목적이 크다고

    생각됩니다. 물론 쓸데없는 트랜잭션을 일으키는 원인으로 분리할 수도 있겠지만요...


    주문테이블의 테이블 분리관리 필요성에 대하여

    *주문헤드 테이블  : 주문번호, 회원 ID ,  사용자(구매자?) 정보 센터엔 상품정보와 결제 방식이 ,고객명,메일,주문일자,    , ....등을 관리하고 (키 : 주문번호)

    *주문내역테이블 : 주문번호, 상품번호(ser?),단가, 수량, 할인률,  합계... (주문상품에 대한 상세 내역을 관리하셔야  될거 같습니다.) (키 : 주문번호 + 상품번호(or Ser_No)


    0
  • 개이득인개발
    544
    2018-07-13 09:45:28

    sspkos

    그렇군요 어차피 포폴용이니 그냥 합쳐야겠네요 의견 감사드립니당.^^

    그렇다면 주문테이블은 테이블을 나누라고하셨는데 이유가 궁금합니다 초보자라서 이해가힘드네요ㅜㅜ


    0
  • sspkos
    84
    2018-07-13 09:47:52

    위에 수정 설명 드렸습니다.

    0
  • 개이득인개발
    544
    2018-07-13 09:59:59

    sspkos

    감사드립니당 선생님 근데 제가 mysql 쓰는데 테이블 생성할 때 제약조건이라던지 외래키 설정하면서 테이블 구축해야하죠?

    0
  • sspkos
    84
    2018-07-13 12:40:53 작성 2018-07-13 12:45:07 수정됨

    mysql이든 oracle이든 mssql이든 테이블간의 relation을 맺는것은 기본이구요

    더러 foreign key를    맺지않고 프로그램으로 처리하는 경우도 있으나

    테이블간을 relation을 맺어서 프로그램하는것이 맞습니다.

    그래야 데이타의 무결성 보장을 받을수 있습니다.


    0
  • 개이득인개발
    544
    2018-07-13 15:22:22

    sspkos 

    선생님 제가 테이블 수정하면 한번더 봐주실수있나요??

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.