SOPT 27기 서버 세미나 자료 참고
한 테이블은 하나 이상의 Primary Key를 가진다. Not null, unique한 값.
검색 속도를 높일 수 있다.
unique해야 한다. primary key를 주로 사용
외래 키. 다른 table의 index. 테이블과 테이블을 연결할 때.
관계형 데이터 베이스를 논리적이고 직관적으로 만드는 과정
이상현상
- 삽입 이상 : 새 데이터를 삽입하기 위해 불필요한 데이터를 함께 삽입해야함
- 갱신 이상 : 중복 튜플 중 일부만 변경하여 데이터가 불일치
- 삭제 이상 : 튜플 삭제하면 꼭 필요한 데이터도 함께 삭제
각 row 마다 하나의 column 값 => ' column 이 원자 값을 갖는다 ' 고 표현
테이블의 모든 칼럼이 완전 함수적 종속을 만족하는 것
primary key가 복합키로 구성된 경우, 복합키의 일부분에만 종속된 속성(부분적 종속)이 없도록
함수적 종속
어떤 Relation 이 있을 때 X값을 알면 Y의 값을 바로 식별할 수 있고, X 값에 의해 Y 값이 달라질 때, Y는 X에 함수적 종속이라고 한다.
정규화된 테이블의 구조를 새로운 통합이나 분할을 통해 바꾸어 주는 것. 정규화 된 테이블의 경우 원하는 자료가 하나의 relation에 존재하지 않아 참조를 여러 번 해야하는 문제가 발생 → 역정규화를 통해 자료 검색 효율을 높임
SQL 을 사용하지 않고 javascript로 db에 접근하는 것
in vscode
express {file}
sudo npm install
npm install sequelize-cli sequelize mysql2
npx sequelize init
sequelize.define('모델 이름', {스키마}, {스키마 옵션});
FreezeTableName
: true 이면 모델명과 db 테이블 이름을 동일하게 설정해줌(복수형 없이)
timestamps
: default- true 이면 테이블 생성될 때 자동으로 createdAt, updatedAt 컬럼이 생성
paranoid
: true로 설정하면 로우 삭제시 실제 데이터는 삭제되지 않고 deletedAt 칼럼이 생김
underscored
: sequelize의 table, column 명은 기본적으로 camel case 인데 이게 true이면 snake case (created_at) 으로 변경됨
const {User} = require('models/index.js');
const user = await User.create({
userName : '윤가영',
age : 21,
address : '서울',
});
const user = await User.findOne({
where : {
name : '임찬기',
}
});
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
[] 내 객체 제외하고 가져오기
// const user = await User.update({수정내용}, {어떤 로우})
const user = await User.update({name : '김가영'}, {
where : {
id: 2
}
})
const user = await User.destroy({
where : {
id : 2
}
});
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,
});
};
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;
sequelize.sync({ alter : false})
.then(() => {
console.log('데이터베이스 연결 성공');
})
.catch((error) => {
console.error(error);
})
모델 동기화해주는 방법
sequelize.sync({})
: table 존재하지 않는 경우에만 테이블 생성
sequelize.sync({ force: true })
: 테이블이 생성되고 이미 존재하는 경우 먼저 삭제 후 생성
sequelize.sync({ alter : true })
: db 에 있는 테이블의 현재 상태 확인한 후 테이블에서 필요한 변경만을 수행