정규화와 시퀄라이즈 시작하기

김가영·2020년 11월 7일
1

Node.js

목록 보기
18/34
post-thumbnail

시퀄라이즈 공식 문서
db 명명 규칙

SOPT 27기 서버 세미나 자료 참고

데이터베이스 용어 정리

Primary Key

한 테이블은 하나 이상의 Primary Key를 가진다. Not null, unique한 값.

INDEX

검색 속도를 높일 수 있다.
unique해야 한다. primary key를 주로 사용

Foreign Key

외래 키. 다른 table의 index. 테이블과 테이블을 연결할 때.

Relation

  • 일대일 관계
  • 일대다 관계 ( 1: N 관계) : 한 사람이 여러 개의 email을 등록


    이런 식으로 세분화 가능하다.
  • 다대다 관계 ( M : N 관계 )

정규화

관계형 데이터 베이스를 논리적이고 직관적으로 만드는 과정

  • 불필요한 데이터(data redundancy)를 제거하고,
  • 데이터 저장을 논리적으로 하고
  • 이상현상 방지

    이상현상
    - 삽입 이상 : 새 데이터를 삽입하기 위해 불필요한 데이터를 함께 삽입해야함
    - 갱신 이상 : 중복 튜플 중 일부만 변경하여 데이터가 불일치
    - 삭제 이상 : 튜플 삭제하면 꼭 필요한 데이터도 함께 삭제

1차 정규화

각 row 마다 하나의 column 값 => ' column 이 원자 값을 갖는다 ' 고 표현

2차 정규화

테이블의 모든 칼럼이 완전 함수적 종속을 만족하는 것
primary key가 복합키로 구성된 경우, 복합키의 일부분에만 종속된 속성(부분적 종속)이 없도록

함수적 종속
어떤 Relation 이 있을 때 X값을 알면 Y의 값을 바로 식별할 수 있고, X 값에 의해 Y 값이 달라질 때, Y는 X에 함수적 종속이라고 한다.

3차 정규화

  • 기본키가 아닌 일반 열에 의존하는 열을 제거하는 것.

역정규화

정규화된 테이블의 구조를 새로운 통합이나 분할을 통해 바꾸어 주는 것. 정규화 된 테이블의 경우 원하는 자료가 하나의 relation에 존재하지 않아 참조를 여러 번 해야하는 문제가 발생 → 역정규화를 통해 자료 검색 효율을 높임

Sequelize ORM

SQL 을 사용하지 않고 javascript로 db에 접근하는 것

start

in vscode
express {file}
sudo npm install
npm install sequelize-cli sequelize mysql2
npx sequelize init

  • config/config.json
    db의 정보를 담는 공간
  • models/index.js
    db의 table을 정의하는 곳
  • migrations
    table column 을 추가/제거할 때 migrations 파일을 통해 실제 db에 반영
  • seeders
    시드 데이터를 생성하는 곳, 주로 샘플 데이터를 생성하고 지울 때 사용(테스트 환경)

sequelize

sequelize.define('모델 이름', {스키마}, {스키마 옵션});

스키마 옵션

FreezeTableName : true 이면 모델명과 db 테이블 이름을 동일하게 설정해줌(복수형 없이)
timestamps : default- true 이면 테이블 생성될 때 자동으로 createdAt, updatedAt 컬럼이 생성
paranoid : true로 설정하면 로우 삭제시 실제 데이터는 삭제되지 않고 deletedAt 칼럼이 생김
underscored : sequelize의 table, column 명은 기본적으로 camel case 인데 이게 true이면 snake case (created_at) 으로 변경됨

Query

create

const {User} = require('models/index.js');
const user = await User.create({
	userName : '윤가영',
    age : 21,
    address : '서울',
});

findOne

const user = await User.findOne({
	where : {
    	name : '임찬기',
    }
});

findAll

const user = await User.findAll({
	where : {
    	age : {[OP,gt] : 21},
    }
});
const users = await User.findAll({
            attributes: ['id', 'email', 'userName'],
        });

attributes : ['id', 'email','userName'] : id, email, userName 만 가져오기

Model.findAll({
  attributes: { exclude: ['baz'] }
});

exclude [] 내 객체 제외하고 가져오기

update

// const user = await User.update({수정내용}, {어떤 로우})
const user = await User.update({name : '김가영'}, {
	where : {
    	id: 2
    }
})

destroy

const user = await User.destroy({
	where : {
    	id : 2
    }
});

Model 만들기

  • models/user.js
module.exports = (sequelize, DataTypes) => {
    return sequelize.define('User', {
    //모델의 Attributes (Column)을 정의하는곳
    email: {
        type: DataTypes.STRING(30),
        unique: true,
        allowNull: false,
    },
    userName: {
        type: DataTypes.STRING(20),
        allowNull: false,
    },
    password: {
        type: DataTypes.STRING(200),
        allowNull: false,
    },
    salt: {
        type: DataTypes.STRING(200),
        allowNull: false,
    }},{
    //모델의 옵션들을 지정하는곳
    freezeTableName: true,
    timestamps: false,
    });
};
  • model/index.js
const Sequelize = require('sequelize');
const env = process.env.NODE_ENV || 'development';
const config = require('../config/config.json')[env];
const db = {};
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
db.sequelize = sequelize; 
db.Sequelize = Sequelize;
db.User = require('./user')(sequelize, Sequelize);
module.exports = db;
  • app.js
sequelize.sync({ alter : false})
.then(() => {
  console.log('데이터베이스 연결 성공');
})
.catch((error) => {
  console.error(error);
})

모델 동기화해주는 방법

sequelize.sync({}) : table 존재하지 않는 경우에만 테이블 생성
sequelize.sync({ force: true }) : 테이블이 생성되고 이미 존재하는 경우 먼저 삭제 후 생성
sequelize.sync({ alter : true }) : db 에 있는 테이블의 현재 상태 확인한 후 테이블에서 필요한 변경만을 수행

profile
개발블로그

0개의 댓글