[Oracle] Sql Developer 데이터베이스 설계

GyuriKim·2024년 5월 13일

Oracle DB

목록 보기
7/7
post-thumbnail
  • 2024.05.13 복습용

DB 설계 (ERD: Entity Realationship Diagram)


요구분석→설계→구현→테스트→유지보수

대부분의 개발자들이 들어가는 파트는 구현부터이다. 신입은 요구분석 파트에 들어가는 일이 적은데, 처음부터 잘못 짜여짐을 방지하기 위함이다. 그렇기에 신입이 요구분석부터 참여했다면 좋은 경험이 된다고들 한다.

요구분석할 때는 어떤 고객에게 제공할지도 중요하다. 이에 관해서는 3종류로 나뉜다.

  • B2B(business-to-business)
    - 기업 간 소프트웨어, 서비스, 또는 솔루션을 교환하거나 협력하는 관계

  • B2C(business-to-consumer)
    - 기업이 개별 소비자에게 직접 제품이나 서비스를 판매하거나 제공하는 관계

  • B2G(business-to-government)
    - 기업이 정부에 제품이나 서비스를 제공하거나 정부의 입찰 과정을 통해 계약을 맺는 관계

--<요구사항 명세서>
--1. 은행은 예금서비스를 고객에게 제공
--2. 은행은 여러지점으로 구성되고 각 지점은 특정 도시에 위치해있음
--3. 각 지점은 고유의 지점명이 부여되며, 추가로 도시, 자산, 영문 지점명, 
--	 지점개설일, 전화번호의 정보를 가짐
--4. 고객은 고유의 고객 번호를 가지며, 이름, 주소, 생년월일 정보를 가짐
--5. 예금계좌는 예금번호로 유일하게 식별되고, 잔고, 입/출금 내역이 관리됨
--6. 한 명의 고객은 여러개의 예금계좌에 입금할 수 있고, 하나의 예금 계좌에는
--	 여러 명의 고객이 예금할 수 있음
--7. 지점은 여러 개의 예금 계좌를 관리
  1. 개체(Entity)를 먼저 찾아서 테이블을 형성해야한다.
  2. 개체만의 관계를 파악해야한다.
  3. 개체의 관계에 따라 물리적인 테이블을 만들어야한다.(DB 생성)

아래의 이미지들이 AQueryTool을 이용하여 만든 ERD이다. 이것을 엑셀로도 내보내기가 가능한데, 그렇게 만든 표는 데이터베이스 설계서라고도 한다.

관계설명
식별 관계
(Identifying Relationship)
자식 엔티티의 기본 키가 부모 엔티티의 기본 키와 동일
자식 엔티티의 존재가 부모 엔티티에 의존
강한 종속성을 지님

비식별 관계
(Non-Identifying Relationship)

자식 엔티티의 기본 키가 부모 엔티티의 기본 키와 다름
자식 엔티티는 부모 엔티티에 의존하지만, 부모 엔티티의 기본 키가 자식 엔티티의 일부로 사용되지 않음
자식 엔티티의 기본 키는 부모 엔티티의 기본 키를 포함하지 않음
약한 종속성을 지님

-- 테이블 순서는 관계를 고려하여 한 번에 실행해도 에러가 발생하지 않게 정렬되었습니다.

-- jijum_t Table Create SQL
-- 테이블 생성 SQL - jijum_t
CREATE TABLE jijum_t
(
    jname     VARCHAR2(20)    NOT NULL, 
    jcity     VARCHAR2(20)    NOT NULL, 
    jmoney    NUMBER          NOT NULL, 
    jEname    VARCHAR2(20)    NOT NULL, 
    jopen     VARCHAR2(20)    NOT NULL, 
    jtel      VARCHAR2(20)    NOT NULL, 
     PRIMARY KEY (jname)
);

-- 테이블 Comment 설정 SQL - jijum_t
COMMENT ON TABLE jijum_t IS '지점';

-- 컬럼 Comment 설정 SQL - jijum_t.jname
COMMENT ON COLUMN jijum_t.jname IS '지점명';

-- 컬럼 Comment 설정 SQL - jijum_t.jcity
COMMENT ON COLUMN jijum_t.jcity IS '도시';

-- 컬럼 Comment 설정 SQL - jijum_t.jmoney
COMMENT ON COLUMN jijum_t.jmoney IS '자산';

-- 컬럼 Comment 설정 SQL - jijum_t.jEname
COMMENT ON COLUMN jijum_t.jEname IS '영문지점명';

-- 컬럼 Comment 설정 SQL - jijum_t.jopen
COMMENT ON COLUMN jijum_t.jopen IS '지점개설일';

-- 컬럼 Comment 설정 SQL - jijum_t.jtel
COMMENT ON COLUMN jijum_t.jtel IS '전화번호';


-- customer_t Table Create SQL
-- 테이블 생성 SQL - customer_t
CREATE TABLE customer_t
(
    cno       VARCHAR2(10)    NOT NULL, 
    cname     VARCHAR2(20)    NOT NULL, 
    caddr     VARCHAR2(50)    NOT NULL, 
    cbirth    VARCHAR2(30)    NOT NULL, 
     PRIMARY KEY (cno)
);

-- 테이블 Comment 설정 SQL - customer_t
COMMENT ON TABLE customer_t IS '고객';

-- 컬럼 Comment 설정 SQL - customer_t.cno
COMMENT ON COLUMN customer_t.cno IS '고객번호';

-- 컬럼 Comment 설정 SQL - customer_t.cname
COMMENT ON COLUMN customer_t.cname IS '이름';

-- 컬럼 Comment 설정 SQL - customer_t.caddr
COMMENT ON COLUMN customer_t.caddr IS '주소';

-- 컬럼 Comment 설정 SQL - customer_t.cbirth
COMMENT ON COLUMN customer_t.cbirth IS '생년월일';


-- account_t Table Create SQL
-- 테이블 생성 SQL - account_t
CREATE TABLE account_t
(
    ano       VARCHAR2(10)    NOT NULL, 
    ajango    NUMBER          NOT NULL, 
    adwd      NUMBER          NOT NULL, 
    jname     VARCHAR2(20)    NOT NULL
);

-- 테이블 Comment 설정 SQL - account_t
COMMENT ON TABLE account_t IS '예금계좌';

-- 컬럼 Comment 설정 SQL - account_t.ano
COMMENT ON COLUMN account_t.ano IS '계좌번호';

-- 컬럼 Comment 설정 SQL - account_t.ajango
COMMENT ON COLUMN account_t.ajango IS '잔고';

-- 컬럼 Comment 설정 SQL - account_t.adwd
COMMENT ON COLUMN account_t.adwd IS '입출금';

-- 컬럼 Comment 설정 SQL - account_t.jname
COMMENT ON COLUMN account_t.jname IS '지점명';

-- Foreign Key 설정 SQL - account_t(jname) -> jijum_t(jname)
ALTER TABLE account_t
    ADD CONSTRAINT FK_account_t_jname_jijum_t_jname FOREIGN KEY (jname)
        REFERENCES jijum_t (jname) ;

-- Foreign Key 삭제 SQL - account_t(jname)
-- ALTER TABLE account_t
-- DROP CONSTRAINT FK_account_t_jname_jijum_t_jname;


-- yegeom_t Table Create SQL
-- 테이블 생성 SQL - yegeom_t
CREATE TABLE yegeom_t
(
    ano    VARCHAR2(10)    NOT NULL, 
    cno    VARCHAR2(10)    NOT NULL, 
    ano    VARCHAR2(10)    NOT NULL, 
     PRIMARY KEY (ano)
);

-- 테이블 Comment 설정 SQL - yegeom_t
COMMENT ON TABLE yegeom_t IS '예금';

-- 컬럼 Comment 설정 SQL - yegeom_t.ano
COMMENT ON COLUMN yegeom_t.ano IS '예금번호';

-- 컬럼 Comment 설정 SQL - yegeom_t.cno
COMMENT ON COLUMN yegeom_t.cno IS '고객번호';

-- 컬럼 Comment 설정 SQL - yegeom_t.ano
COMMENT ON COLUMN yegeom_t.ano IS '계좌번호';

-- Foreign Key 설정 SQL - yegeom_t(cno) -> customer_t(cno)
ALTER TABLE yegeom_t
    ADD CONSTRAINT FK_yegeom_t_cno_customer_t_cno FOREIGN KEY (cno)
        REFERENCES customer_t (cno) ;

-- Foreign Key 삭제 SQL - yegeom_t(cno)
-- ALTER TABLE yegeom_t
-- DROP CONSTRAINT FK_yegeom_t_cno_customer_t_cno;

-- Foreign Key 설정 SQL - yegeom_t(ano) -> account_t(ano)
ALTER TABLE yegeom_t
    ADD CONSTRAINT FK_yegeom_t_ano_account_t_ano FOREIGN KEY (ano)
        REFERENCES account_t (ano) ;

-- Foreign Key 삭제 SQL - yegeom_t(ano)
-- ALTER TABLE yegeom_t
-- DROP CONSTRAINT FK_yegeom_t_ano_account_t_ano;

실습_01


--1. 학생은 고유의 학번이 부여되며, 주민등록번호, 이름, 주소, 전화번호, 학년 정보를 가짐
--2. 교수는 고유의 교수번호가 부여되며, 주민등록번호, 이름, 주소, 전화번호, 직위, 임용년도 정보를 가짐
--3. 학생과 교수는 하나의 학과에만 소속될 수 있으나, 하나의 학과에는 여러명의 학생과 교수가 소속됨
--4. 학과는 고유의 학과번호가 부여되며, 학과명, 사무실, 전화번호 정보를 가짐
--5. 강좌는 고유의 강좌번호가 부여되며 강좌명, 학점수, 연도, 학기, 강의식, 수강인원 정보를 가진
--6. 하나의 강좌는 한 명의 교수가 강의하고, 한 교수는 여러 강좌를 강의함
--7. 한 학생은 하나 이상의 강좌를 수강할 수 있음
--8. 각각의 학생이 수강한 과목에 대해서 성적이 부여됨

해당 요구사항 명세서를 가지고 DB 설계를 진행해보자.

1. 개체 찾기

개체(Entity)속성(Attribute)
학생(Student)학번 (StudentID, Primary Key)
주민등록번호 (SSN)
이름 (Name)
주소 (Address)
전화번호 (Tel)
학년 (Grade)
교수 (Professor)교수번호 (ProfessorID, Primary Key)
주민등록번호 (SSN)
이름 (Name)
주소 (Address)
전화번호 (Tel)
직위 (Position)
임용년도 (HireYear)
학과 (Department)학과번호 (DepartmentID, Primary Key)
학과명 (DepartmentName)
사무실 (Office)
전화번호 (Tel)
수강강좌 (Class)강좌번호 (ClassID, Primary Key)
강좌명(ClassName)
학점수 (ClassCredit)
연도(ClassYear)
학기(Semester)
강의실(ClassRoom)
수강인원(StudentsNumber)

2. 개체 간의 관계 파악

  • 학생과 학과 (1:N)
    - 학생은 하나의 학과에만 속할 수 있고, 학과는 여러 학생들을 포함할 수 있음
    - 학생과 학과 간의 일대다(1:N) 관계

  • 교수와 학과 (1:N)
    - 교수는 하나의 학과에만 속할 수 있고, 학과는 여러 교수들을 포함할 수 있음
    - 교수와 학과 간의 일대다(1:N) 관계

  • 수강강좌와 학생 (M:N)
    - 한 학생은 하나 이상의 강좌를 수강할 수 있고, 한 강좌는 여러 학생들을 포함할 수 있음
    - 학생과 수강강좌 간의 다대다(M:N)관계
    - 중간에 연결 테이블 필요

  • 수강강좌와 교수 (1:N)
    - 한 교수는 여러 강좌를 강의할 수 있고, 한 강좌는 한 명의 교수에 의해 강의가 진행됨
    - 교수와 수강강좌 간의 일대다(1:N) 관계

  • 수강강좌와 학과 간의 관계 (1:N)
    - 강좌는 한 학과에 속하며, 학과는 여러 강좌를 포함할 수 있음
    - 수강강좌와 학과 간의 다대다(1:N)관계

3. 물리적 테이블 생성

오른쪽 마우스 누르고 새탭에서 이미지 열기 하면 더 잘 보임
profile
_〆(。。)

0개의 댓글