MySQL과 같은 관계형데이터베이스(RDBMS)는 관리하고자하는 데이터의 구조(Schema)와 관리항목(Column),항목별 제약사항(Constraint)들을  미리 정해놓고
정해진 형태의 테이블 구조에 결함이없는 데이터(무결성데이터)를 안전하게 보관/저장 데이터를 관리하는 방식을 제공합니다.

관계형 데이터베이스는 위와 같이 관리코자 하는 데이터의 형태를 미리 정해놓은 정형데이터를 관리하는 핵심 DBMS소프트웨어로
MySQL,Oracle,PostgreSQL,MariaDB,MSSQL등이 존재합니다. 

edu_community Database내에는 총 7개의 물리 테이블이 존재하며 각각 테이블의 목적은 아래 ERD문서를 참고해주시기 바랍니다. 

-회원 정보테이블 : 일반 사용자 정보 관리 테이블
-관리자 정보테이블 : 관리자 사이트에 관리자 계정 정보 관리 테이블
-채널 정보테이블 : 채팅 채널정보 관리 테이블
-채널회원 정보 테이블 : 채팅 채널별 참여 회원 정보 테이블
-채널메시지 정보 테이블 : 채팅 채널별 각종 메시지정보 관리 테이블
-게시글 정보테이블 : 각종 게시글/블로깅 게시글 정보 관리 테이블
-게시글 첨부파일 정보 테이블 : 게시글 첨부파일 정보 테이블 

edu_community DB 논리(Logical) ERD


edu_community DB 물리(Physical) ERD


1) Table 만들기 

테이블의 구조를 간략히 분석해보면
해당 테이블에서 관리하는 관리항목들의 집합을  Columns(Attributes,Fields)라고 하며
개별적인 관리항목을 Column이라고 말하며 Column들의 순번을 Degree라고 하며 컬럼은 Attributes,Filed란 다양한 용어로도 함께 사용됩니다.

Columns로 정의된 관리항목에 실제 등록된 데이터들의 집합을 Row(Record,Tubple) 이라고 하며
Row의 집합을 Rows,RecordSet이라고 합니다.

아래 사용자 테이블의 경우 Row1은 강창훈이라는 사용자의 모든 컬럼값들의 집합이라고 말할수 있습니다.
Rows(Records) 집합의 Row의 고유번호를 Cardinality라고 합니다. 

정리하면 하나의 테이블은 데이터의 구조를 정의하는
Columns (테이블의 관리항목을 정의하는영역)와 해당 Columns에 등록된 실제 데이터들의 집합인 Rows(Records=등록된 실제 데이터 목록)로 구성된 DB객체라고 말할수 있습니다.

Step1)테이블 추가하기
-Workbench에서 관련 데이터베이스를 선택합니다.
-Schemas탭에서 관련 데이터베이스를 마우스로 더블클릭하면 볼드체로 해당 DB명이 표시됩니다.
-Schemas탭에서 볼드체로 선택된 DB가 현재 Workbench에서 바라보는 기준(현재작업하는) DB가 됩니다. 
-Tables 메뉴에 오른쪽 마우스클릭 Create Table 메뉴를 클릭합니다.

2) 테이블 만들기 - 기본정보 
-Table Name: 테이블명을 영문으로 입력합니다. 소문자 언더바 조합  ex)member, member_config
-Charset/Collation : DB생성할떄와 같이 개별 테이블에 Charset/Collation 지정이 가능합니다. 설정하지 않으면 소속 DB의 Charset/Collation을 상속받습니다
-Charset/Collation은 별도 선택지 않습니다.
-Engine: InnoDB(기본값) : MySQL서버 Database Engine 타입으로 기본 InnoDB선택합니다.
* 데이터베이스 엔진은 DBMS가 데이터베이스에 대한 데이터처리(등록/수정/삭제/조회)하는 표준화된 방식을 제공하며 MySQL서버는 다양한 종류의 DB엔진을 제공합니다.
-Comments: 테이블에 대한 주석(설명)으로 혼자 개발할게 아니면 반드시 테이블에 대한 설명을 입력합니다.

Ex)예시
-Table Name: member
-Charset/Collation : Default Charset / Default Collation
-Engine: InnoDB


3)테이블 만들기 - 데이터 관리항목 추가 
관계형 데이터베이스는 정형데이터를 각각의 테이블마다 테이블 객체의 관리항목(컬럼=Column)들을 정의하면서 테이블의 구조와 형태를 정의하고
각각의 컬럼 항목들에 각종 제약사항들(Constraint)을 설정하여 부적합한 데이터의 입력을 사전에 방지하고 데이터에 결함이 없는 무결성 데이터 유지하는 방법을 제공합니다. 

관계형 데이터베이스의 가장 중요한 사용목적은 조회성능보다 무결성 데이터의 보장과 무결성 데이터의 영속적(영구지속) 안전한 보관 관리가 1순위 사용목적입니다. 

**제약사항(Contraints)은 RDBMS(관계형데이터베이스)의 데이터 무결성 원칙을 지켜주기 위한 수단으로 아래와 같이 다양한 종류의 제약조건들이 존재합니다.
-Primary Key (PK) : 하나의 테이블에는 반드시 각각의 등록된 데이터셋(로우-Row)을 구분해줄수 있는 항목(컬럼)이 하나 이상은 존재해야한다는 제약 
-Foreign Key : 특정테이블에서 특정테이블의 특정 컬럼을 참조한다면 참조하는 테이블의 어떤 항목을 참조하는지(참조키)여부와 참조키 항목의 값은 참조하는 부모키 항목의 값내에 존재해야한다는 제약
-DataTypes : 각 관리항목(컬럼)의 데이터 타입이 지정되면 해당 컬럼의 값은 반드시 해당 지정된 데이터 값 유형이 아니면 안된다는 제약 ex)정수타입컬럼인데 문자가 들어오면 에러발생
-Null Check : Null은 해당 항목에 값이 아예 안들어온 상태를 말하며 문자열 공백 데이터와는 다릅니다. NotNull 널을 허용안한다는 말로 반드시 해당 컬럼에는 값이들어와야한는 말입니다.
-Unique : 해당 테이블에 해당 컬럼이 Unique로 설정되면 해당 테이블의 해당 컬럼내 값들은 중복된 값이 존재하면 안된다는 제약
....

** 테이블 관계 설정 및 정규화/모델링에 대해서는 추후 별도 시간을 가지고 블로깅 예정이오니 참고바랍니다.

자 지금 부터 회원테이블(member)의 관리항목(컬럼-Column)을 하나씩 추가하면서 제약사항도 설정해보겠습니다.
먼저 아래와 같이 모든 항목이름을 먼저 Column Name에 영문으로 입력합니다.

member_id
email
member_password
name
profile_img_path
telephone
entry_type_code
use_state_code
birth_date
entry_date
edit_date
edit_member_id


해당 컬럼별 제약사항들을 아래와 같이 컬럼별로 설정합니다.


Step1)사용자고유번호(member_id)
-시스템에서 인식하는 사용자 고유번호로 자동채번되게 설정합니다.
-Column Name: member_id
-DataType: INT :정수형 숫자형지정
-PK 항목 : 체크 : member테이블내 모든 사용자들마다 고유번호가 주어지며 해당 고유번호를 통해 개별사용자를 식별하기 위해 PK 체크박스를 체크합니다. 
               PK로 설정되면 해당 컬럼이름 옆에 노란색으로 열쇠모양(PK)이 표시됩니다.
-NN 항목 : 체크 NN=NotNull의 약자로 NULL을 허용하지 않는다,즉 반드시 어떤데이터라도 들어와한다고 설정함,PK를 설정하면 NN은 기본체크됨
-AI 항목 : 체크  : AI는 Auto Increment의 약자로 자동 숫자 채번기능제공 1,2,3이런식으로 추가되며 3번 항목이 삭제되면 4번부터 채번이 됩니다.
-Comments: 회원고유번호

Step2)이메일주소: email
-Column Name : email
-DataType: :VARCHAR(100)
-NN 항목 : 체크 : 필수입력 항목
-Comments: 사용자메일주소


Step3)비밀번호:member_password
-Column Name : member_password
-DataType: VARCHAR(500)
-NN 항목 : 체크
-Comments: 사용자 난독화된 해시 암호 문자열


Step4)이름:name
-Column Name : name
-DataType: VARCHAR(100)
-NN 항목 : 체크
-Comments: 회원명


Step5)프로필이미지경로:profile_img_path
-Column Name : profile_img_path
-DataType: VARCHAR(300)
-Comments: 회원프로파일 이미지경로


Step6)전화번호:telephone
-Column Name : telephone
-DataType: VARCHAR(200)
-Comments: 전화번호-개인정보 양방향암호화(AES) 적용


Step7)생년월일:birth_date
-Column Name : birth_date
-DataType: VARCHAR(200)
-Comments: 생년월일-개인정보 양방향암호화(AES) 적용


Step8)가입유형코드:entry_type_code
-Column Name : entry_type_code
-DataType: TINYINT :
-NN 항목 : 체크
-Comments: 가입유형코드 0:직접가입 1:페이스북SNS


Step9)가입상태코드:use_state_code
-Column Name : use_state_code
-DataType: TINYINT :
-NN 항목 : 체크
-Comments: 이용상태 0:허용대기 1:사용중 2:탈퇴처리


Step10)가입일시:entry_date
-Column Name : entry_date
-DataType: DATETIME :
-NN 항목 : 체크
-Comments: 회원가입일시


Step11)수정일시:edit_date
-Column Name : edit_date
-DataType: DATETIME :
-Comments: 수정일시


Step12)수정자고유번호:edit_member_id
-Column Name : edit_member_id
-DataType: INT :
-Comments: 수정자고유번호


해당 테이블을 통해 관리하고자 하는 모든 관리항목별  컬럼들을 생성했다면 Apply 버튼을 클릭합니다.


Step13) 테이블 만들기 SQL구문 생성/확인  

테이블 생성과 관련한 SQL구문이 생성된것을 확인해보세요. Apply 버튼을 클릭하면 

CREATE TABLE `edu_community`.`member` SQL 구문이 MySQL서버로 전달되어 실행되고 member라는 물리적 테이블이 생성됩니다. 




CREATE TABLE `edu_community`.`member` (

  `member_id` INT NOT NULL AUTO_INCREMENT COMMENT '회원고유번호',

  `email` VARCHAR(100) NOT NULL,

  `member_password` VARCHAR(500) NOT NULL,

  `name` VARCHAR(100) NOT NULL,

  `profile_img_path` VARCHAR(300) NULL,

  `telephone` VARCHAR(200) NULL,

  `birth_date` VARCHAR(200) NULL,

  `entry_type_code` TINYINT NOT NULL,

  `use_state_code` TINYINT NOT NULL,

  `entry_date` DATETIME NOT NULL,

  `edit_date` DATETIME NULL,

  `edit_member_id` INT NULL,

  PRIMARY KEY (`member_id`))

COMMENT = '회원정보';



Step14)기존 테이블 구조 수정 및 테이블 삭제하기 
이미 만들어진 테이블의 구조/항목관리/설정 변경은
Tables 목록에서 해당 테이블 선택> 오른쪽 마우스 클릭 Alter Table 메뉴를 클릭하여 기존 테이블의 구조/관리항목/설정값들을 수정후 저장합니다.
** 기존 테이블 컬럼을 삭제하면 컬럼에 저장된 데이터도 모두 삭제되오니 컬럼 삭제는 주의해서 사용하시기 바랍니다.

이미 만들어진 테이블를 삭제는
Tables 목록에서 해당 테이블 선택> 오른쪽 마우스 클릭 Drop Table 메뉴를 클릭하여 삭제가능합니다.
** 테이블을 삭제하면 테이블에 저장된 데이터도 모두 삭제되오니 테이블 삭제는 주의해서 사용하시기 바랍니다.

시간이 되시는분들은 상기 물리ERD 이미지를 참고해서 7개 테이블 모두를 Workbench로 만들어 보시기 바랍니다.