dukDukz

[블록체인] 프로젝트 DB 설계 본문

카테고리 없음

[블록체인] 프로젝트 DB 설계

헤일리_HJ 2021. 9. 29. 12:47

# DB SQL

 

통계 함수

스킬적으로 배울게 많다.

 

MIN

MAX 

SUM

AVG

 

사용 해봐야함.

 

ex)

캔들차트

3분봉 5분봉 일봉 주봉 월봉

 

최고 종가 시가 최저

3분 5분 간격으로... 

 

오늘의 시작하는 가격, 오늘 끝나는 가격

- 거래되는 것은 transaction

거래 완료 기점으로 가격을 구해야 한다.

 


# sequelize 는 어떤 라이브러리?

 

ORM 이다.

ORM 사용 경험 있나요?  - 있다고 해야함

 


# transaction table 만들기

 

일봉에 대한 쿼리문을 만들어보자

 

models > tansaction.js 생성

 

user.js 에 있는거 복사해서 가져옴

models > index.js 에 추가


db.transaction = require('./transaction')(sequelize,Sequelize)

# txid 는 뭐냐?

: 블록체인에서 거래원장

 

* sendtoaddress

내 코인을 다른 곳에 보낼때 사용하는 명령어

이렇게 보내고 나서

결과물은 엄청 긴 결과물

asdf845sgdfs51384erasef 이런식으로 나온게 바로 txid 이다.

 

txid 값으로 데몬에서 조회하면 거래 진행 상황을 볼 수 있다.

그래서 txid 값을 저장하기 위해서 table에 공간을 만들어 준거임

 

 

그리고 우리는 수수료가 없다고 치고

돈을 안버는 거래소....

commision

 

 

a 는 매수자 (사는 사람)

b 는 매도자 (파는 사람)

 

왜냐하면 거래 라는것은 사는 사람과 파는 사람이 존재해야 이루어진다.

그게 바로 transaction 이다.

 

거래를 하면 transaction table에 오게 된다.

 

거래 완료 후 완료자 가리기

active 0 으로 만들기

 


 

# 딱 맞는 코인을 파는 사람과 사는사람이 존재하지 않는경우?

 

사는 사람이 보는 우선순위

 

1. 가격

만약 나는 100개 사고 싶은데 판매자는 20개만 팔음

그러면 20개가 사지고 나머지 80은 주문장에 걸려있음

=> 주문서 쪼개기 그리고 active 도 0으로 안바뀌고 1로 남아있어야함.

파는 사람이 나타날 때까지 기다려야함.(주문 취소하지 않는 이상.)


2. 날짜

1000원에 거래가 계속되다보니까

누군가가 더 매수를 하려고 한다.

a, b 거의 동시에 사겠다고 걸어놓은거임

근데 파는 사람이 한명임.

그래서 먼저 매수한 사람 기준으로 먼저 판다.

아주 옛날부터 걸었던 사람 부터 거래가 된다.

 


# 양봉

 

오늘 날짜 기준으로

1200~950 이 거래 되었음

 

전날의 마지막 거래 , 금일의 마지막 거래가 무엇인지가 중요함

 

시가는 (전날 마지막거래 가격) 1000원이 되고 

오늘 가장 높은 가격 = 종가 = 1200

오늘 가장 낮은 가격 = 950

 

4가지 값 = 시 종 고 저 => 라이브러리에서 캔들차트를 그려준다

 

코인은 24시간 돌기 때문에

시가 종가 의 기준이 거래소 마다 다를 수 있음

 

업비트의 경우 09시 기준으로 전날과 오늘날을 나누게 된다.

 

29일 8:59 거래 = 시가

30일 9:00 거래 = 종가

 


 

# price 에서 가장 큰 값 뽑으려면??

select max(price) from transaction where 날짜

        min

 


# 오늘 기준으로 마지막 거래는?

reg_date 기준으로 오름차순으로

 

전날 마지막 : 시가

오늘 마지막 : 종가

 

# 시간별 거래 

select price from transaction order by reg_date desc limit 0,1

select * from transaction order by reg_date asc

작은거부터 크게

시간 순서대로 정렬이 된다

한 줄만 보고싶다면 limit 0,1 로 맨 처음 거래만 볼 수 있다는 것.

 

오늘 날짜에서 맨 마지막 거래 를 알고 싶으면 시간의 정렬을 반대로 하면됨

select * from transaction order by reg_date desc limit 0,1

 

 


# DB 가 뭘까...

 

데이터 베이스.... 

어떻게 정확하게 불러야 할까??

RDBS 라고 불러야 정확한 명칭이다.

Relational Database Management System

 

테이블 설계할 때 직접적으로 연결을 시켜줘야 한다.

그 때 사용할 수 있는게 foreign key

 

# 테이블         테이블 

  필드            필드

  필드            필드

  필드            필드

 

어떻게 매칭할지 1: N 을 가장 많이 쓰고 중요하다.

 


# 1: N 매칭

 

게시판에서 예시를 들 수 있다.

하나의 게시물에 여러개 댓글을 달 수 있다.

 

게시판      댓글

고유값      고유값

            게시판의 고유값

제목        제목

내용        내용

등록날짜    등록

 

user 와 asset 의 관계  1: N 관계

 

asset 의 userid 가 foreign key

 


 

[models > index.js]

Object.keys(db).forEach(modelName => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

 

이 부분을 봐보자

여태껏 써본적은 없지만...

해당 객체의 속성값을 배열로 만들어서 리턴해주는 함수

이 코드에서 db 라는 객체는 

User, Assets, Transaction 속성이 들어가고 이 값들을 뽑아서 배열로 만든다는 의미이다.

 

Object.keys(db)

// [User, Assets, Transaction]

 

그리고 이 배열을 forEach 문을 돌린다.

 

modelName : User 안에 들어간 값을 여기에 넣는다. 그 중에 associate 라는 값

 

근데 가보니까 없음

 

그래서 if 문으로 걸어주면서 이 매서드가 있는지 확인하고

있으면 돌리고 없으면 나간다.



만들어주고 싶으면 user.js 에서 가서 뭔가를 만들어줘야 함

 

일단 assets.js 생성해주고 작성해준다.

 

테이블 생성 되었나 확인하기