**이글은 백엔드 공부를 위한 백엔드 프로젝트 설계 구현 과정입니다.
벡엔드 프로젝트 과정에서 어떠한 일을 하고 프로젝트 구성이 어떻게되는지 경험과 공부하기위해 진행하는 과정을 기록하는 것입니다.
저번에 작성했던 요구사항 명세서 중에 데이터베이스설계를 위한 요구사항 명세서를 보고 DB설계를 해보려고합니다.
데이터베이스는 비즈니스 프로세스를 반영해야 합니다. 따라서 엔티티, 속성, 관계 등을 정확하게 식별하고 모델링하는 것이 중요합니다.
데이터베이스 스키마 설계시 정규화는 중요한 고려사항입니다. 정규화는 중복을 최소화하고, 데이터 무결성을 보장하며, 데이터의 일관성을 유지하는 데 도움이 됩니다.
데이터 무결성은 데이터베이스에서 데이터의 정확성, 일관성, 신뢰성을 보장하는 것입니다. 이를 위해 기본 키, 외래 키, 유니크 키 등의 제약 조건을 활용할 수 있습니다.
대용량 데이터를 처리할 때는 쿼리 성능이 중요해집니다. 따라서 인덱싱, 테이블 파티셔닝, 쿼리 최적화 등을 고려하여 성능이 좋은 스키마를 설계해야 합니다.
미래의 비즈니스 요구사항이나 데이터 양의 증가에 대비하여 데이터베이스 스키마는 확장성을 고려하여 설계해야 합니다.
데이터베이스에는 중요한 정보가 저장되기 때문에, 스키마 설계시 데이터 접근 권한을 고려하여야 합니다.
데이터베이스 스키마와 관련된 모든 정보를 문서화하여 유지 관리와 커뮤니케이션을 용이하게 합니다.
- 유니콘 쇼핑몰에 회원으로 가입하려면 회원아이디, 비밀번호, 이름, 나이, 전화번호를 입력해야한다.
- 가입한 회원에게는 등급과 포인트가 부여된다.
- 회원은 중복되지 않은 회원번호가 부여되고 회원아이디는 중복되지 않아야 하고, 회원은 회원번호로 식별한다.
- 상품에 대한 상품번호, 상품명, 재고량, 단가 정보를 유지해야한다.
- 상품은 중복되지 않은 상품번호가 부여되고 상품명은 중복되지 않아야하고, 상품은 상품번호로 식별한다.
- 회원은 여러 상품을 주문할 수 있고, 하나의 상품을 여러 회원이 주문할 수 있다.
- 회원이 상품을 주문하면 주문에 대한 주문번호, 주문수량, 배송지, 주문일자 정보를 유지해야한다.
- 각 상품은 한 제조업체가 여러번 공급할 수 있고, 제조업체 하나는 여러 상품을 공급할 수 있다.
- 제조업체가 상품을 공급하면 상품명, 공급량, 공급일자 정보를 유지해야 한다.
- 제조업체에 대한 제조업체번호, 제조업체명, 전화번호,위치, 담당자 정보를 유지해야한다.
- 제조업체는 중복되지 않은 제조업체번호가 부여되고 제조업체명은 중복되지 않아야한다.
- 회원은 게시글을 여러 개 작성할 수 있고, 게시글 하나늫 한 명의 회원만 작성할 수 있다.
- 게시글에 대한 글번호, 글제목, 글내용, 작성일자 정보를 유지해야한다.
- 게시글은 중복되지 않은 게시글번호가 부여되고 글번호로 식별한다.
- 회원은 여러 상품을 찜할 수 있고, 하나의 상품을 여러 회원이 찜할 수 있다.
- 회원이 상품을 찜하면 찜에 대한 찜번호에 대한 찜번호, 찜 일자 정보를 유지해야한다.
- 회원은 여러 상품을 장바구니에 담을 수 있고, 하나의 상품을 여러 회원이 장바구니에 담을 수 있다.
- 회원이 상품을 장바구니에 담으면 장바구니에 대한 장바구니 번호, 수량, 장바구니 일자 정보를 유지해야한다.
- DBMS에 독립적인 개념적 스키마 설계
- 요구사항 명세서를 개념적 구조로 표현한다.
- 결과물 : E-R 다이어그램
- 유니콘 쇼핑몰에 회원으로 가입하려면 회원아이디, 비밀번호, 이름, 나이, 전화번호를 입력해야한다.
- 가입한 회원에게는 등급과 포인트가 부여된다.
- 회원은 중복되지 않은 회원번호가 부여되고 회원아이디는 중복되지 않아야 하고, 회원은 회원번호로 식별한다.
- 상품에 대한 상품번호, 상품명, 재고량, 단가 정보를 유지해야한다.
- 상품은 중복되지 않은 상품번호가 부여되고 상품명은 중복되지 않아야하고, 상품은 상품번호로 식별한다.
- 회원은 여러 상품을 주문할 수 있고, 하나의 상품을 여러 회원이 주문할 수 있다.
- 회원이 상품을 주문하면 주문에 대한 주문번호, 주문수량, 배송지, 주문일자 정보를 유지해야한다.
- 각 상품은 한 제조업체가 여러번 공급할 수 있고, 제조업체 하나는 여러 상품을 공급할 수 있다.
- 제조업체가 상품을 공급하면 상품명, 공급량, 공급일자 정보를 유지해야 한다.
- 제조업체에 대한 제조업체번호, 제조업체명, 전화번호,위치, 담당자 정보를 유지해야한다.
- 제조업체는 중복되지 않은 제조업체번호가 부여되고 제조업체명은 중복되지 않아야한다.
- 회원은 게시글을 여러 개 작성할 수 있고, 게시글 하나는 한 명의 회원만 작성할 수 있다.
- 게시글에 대한 글번호, 글제목, 글내용, 작성일자 정보를 유지해야한다.
- 게시글은 중복되지 않은 게시글번호가 부여되고 글번호로 식별한다.
- 회원은 여러 상품을 찜할 수 있고, 하나의 상품을 여러 회원이 찜할 수 있다.
- 회원이 상품을 찜하면 찜에 대한 찜번호, 찜 일자 정보를 유지해야한다.
- 회원은 여러 상품을 장바구니에 담을 수 있고, 하나의 상품을 여러 회원이 장바구니에 담을 수 있다.
- 회원이 상품을 장바구니에 담으면 장바구니에 대한 장바구니 번호, 수량, 장바구니 일자 정보를 유지해야한다.
- 회원: 속성으로는 회원번호 (Primary Key), 회원아이디, 비밀번호, 이름, 나이, 전화번호, 등급, 포인트를 가집니다.
- 상품: 속성으로는 상품번호 (Primary Key), 상품명, 재고량, 단가를 가집니다.
- 제조업체: 속성으로는 제조업체번호 (Primary Key), 제조업체명, 전화번호, 위치, 담당자를 가집니다.
- 게시글: 속성으로는 글번호 (Primary Key), 글제목, 글내용, 작성일자를 가집니다.
- 작성: 회원과 게시글 사이의 관계로, 한 명의 회원이 여러 게시글을 작성할 수 있습니다. (1:N)
- 공급: 제조업체와 상품 사이의 관계로, 한 제조업체가 여러 상품을 공급할 수 있고, 같은 상품을 여러번 공급할 수 있습니다.. (M:N)
- 주문: 회원과 상품 사이의 관계로, 한 명의 회원이 여러 상품을 주문할 수 있고, 하나의 상품을 여러 회원이 주문할 수 있습니다. (M:N)
- 찜: 회원과 상품 사이의 관계로, 한 명의 회원이 여러 상품을 찜할 수 있고, 하나의 상품을 여러 회원이 찜할 수 있습니다. (M:N)
- 장바구니담기: 회원과 상품 사이의 관계로, 한 명의 회원이 여러 상품을 장바구니에 담을 수 있고, 하나의 상품을 여러 회원이 장바구니에 담을 수 있습니다. (M:N)

회원 테이블
CREATE TABLE Members (
MemberID INT PRIMARY KEY,
MemberName VARCHAR(100),
Age INT,
PhoneNumber VARCHAR(15),
Points INT,
Level VARCHAR(20),
UserName VARCHAR(50) UNIQUE,
Password VARCHAR(50)
);
상품 테이블
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100) UNIQUE,
Stock INT,
Price DECIMAL(10,2)
);
제조업체 테이블
CREATE TABLE Manufacturers (
ManufacturerID INT PRIMARY KEY,
ManufacturerName VARCHAR(100) UNIQUE,
PhoneNumber VARCHAR(15),
Location VARCHAR(100),
ContactPerson VARCHAR(100)
);
주문 테이블
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderQuantity INT,
DeliveryLocation VARCHAR(100),
OrderDate DATE,
MemberID INT,
ProductID INT,
FOREIGN KEY (MemberID) REFERENCES Members(MemberID),
FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);
공급 테이블
CREATE TABLE Supplies (
SupplyID INT PRIMARY KEY,
SupplyQuantity INT,
SupplyDate DATE,
ManufacturerID INT,
ProductID INT,
FOREIGN KEY (ManufacturerID) REFERENCES Manufacturers(ManufacturerID),
FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);
찜 테이블
CREATE TABLE Favorites (
FavoriteID INT PRIMARY KEY,
FavoriteDate DATE,
MemberID INT,
ProductID INT,
FOREIGN KEY (MemberID) REFERENCES Members(MemberID),
FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);
장바구니 테이블
CREATE TABLE Cart (
CartID INT PRIMARY KEY,
Quantity INT,
CartDate DATE,
MemberID INT,
ProductID INT,
FOREIGN KEY (MemberID) REFERENCES Members(MemberID),
FOREIGN KEY (ProductID) REFERENCES Products(ProductID)
);
게시글 테이블
CREATE TABLE Posts (
PostID INT PRIMARY KEY,
PostTitle VARCHAR(100),
PostContent TEXT,
PostDate DATE,
MemberID INT,
FOREIGN KEY (MemberID) REFERENCES Members(MemberID)
);
저도 개발자인데 같이 교류 많이 해봐요 ㅎㅎ! 서로 화이팅합시다!