오늘 머먹지 - DB 설계
Feedback
- 다른 서버에서 다이어그램을 열려할 때 꺼지는 현상이있는데 이거는 버그인걸로,,,,,
-> 낮은 버전을 깔아도되고,,,, (트러블 슈팅 - 삽질?)
- 에러메세지가 없는경우 > window > event viewer 가서 확인해보기 > 오류라고 떡하니 있음,,,,
> DataDesigners.dll 에 문제가 있는걸로 보여짐 > + error 붙여서 구글링 해보기 > SSMS 18.1 Crashes when Opening~~~ 이게 정확히 우리가 겪고있는 현상에 대한 .... 이걸 보셈 > 근데 해결방법은 없었음..ㅎ > 원인을 모르겠음,,,, > 포기하려는 찰나에 > 새로운 다이어그램 만들기 하면 ... .일시적으로 해결되는 것을 알 수 있었음.
- 어떨때 smalldatetiem을 쓰는지?
- 몇장을 쓰는지? TicketCount
- RemaingTicketCount 이런식으로 긴게 사실 나을 수도 있음!
- 한사람당 한번만 투표하게 한다면 Vote 테이블에 PlayerID, Date를 두개를 묶어서 기본키!
- 누구의 말을 따라서 식당을 갔을지
- 만약 메뉴를 통해서 투표를 하려면 메뉴의대한 중복도 처리해야하고 그 음식점에서 이 음식을 팔고있는지도 체크해야함 (도서관사례로 연결지을 수 있음 MetaBook, Book)
- 코드테이블 -> 나중에 설명해주세욤
- 양쪾에 키가있는 1:1 관계는 사실 테이블을 합칠수도 있음
* 사람 테이블에서 picture를 추가하고 싶을때 그안에 있으면 데이터를 불러올때 꽤나 많은 시간이 걸림 (10000명이있을때) 그래서 이때 picture테이블을 따로 떼서 1:1 관계로 만듦 -> 이는 정규화를 거스르는일, 역정규화라고 부름
=> 이처럼 성능상의 이유로 1:1 데이터를 만듦!
- ERWin..?
- naming convention (이름규약)
Pascal : 각 단어의 첫 글자를 다 대문자로 -> StudentId (C# - 나머지)
Camel : 파스칼이랑 같은데 제일 첫글자는 소문자로 (C# - 지역변수, 매개변수)
Snake : this_is_snake (파이썬같은경우는 이렇게 씀)
--> 셋중에 팀장님이 쓰는걸로 따라 써라!
--> 아니면, 그언어에서 가장 보편적으로 쓰이는 케이싱이 뭔지 찾아보고 그것을 받아들이셈
(무엇보다 중요한건 일관성!)
- 최고 존엄의 아들이 있을경우 코인같은건 필요가 없을테니까,,,, NULL값을 할수 있도록
- Vote안에 IsOK가 있으면 안됨
1) 나는 00를 안가겠따 - 거부권을 학생테이블이 가지면 됨!
학생 - RestaurantId를 가지면됨 (VetoRetaurant) NULL 가능
2) 오늘만 00를 안가겠다
Vote테이블에는 수강생수만큼 꼭 생겨야되는데 Veto는 없을수도 있다..... -> 때문에 별개의 테이블을 만듦 (Veto)
Veto - Date, StudentId, RestaurantId => 두개이상 VETO하고 싶으면 세개를 다 키로
모두 지우고 다시 복구하는 법
1. 데이터베이스 > 우클릭 > 테스크 > 백업 > 경로/위치 확인 == 백업 성공
2. 과감하게 삭제
3. 복원하기
기본을 C루트로 받았기때문에 폴더가 생겨있고 안에 BackUp이라는 폴더가있음!
* Data 폴더안에있는 db를 복붙하면 다 잠겨있어서 안됨!
ex) t2.bak - 우클릭 복원 > 원본 > 디바이스(E) > 백업미디어 : 파일 > 추가
1. 우클릭 > 테스크 > 스크립트 생성
2. 전체데이터베이스 및 모든 데이터베이스 개체 스크립링 > 다음 > **고급** > 서버 버전에 대한 스크립트 호환 수준을 꼭 결정해주어야함!!! SQL SEVER 2017 > 스크립링할 데이터 형식 : (스키마만 -데이터구조만내보내는거) 스키마 및 데이터 > 새쿼리창에 저장 > 다음 > 다음
3. 쿼리문이 보임!
* db 관리중 가장 중요한것은 매일밤 3시에 백업을 하는건데 이거를 수동적으로 할 수 는 없는것. 그렇기때문에 자동화 시켜놓아야함 이방법들은 다 구현되어있음!! - 할수있다는것만 알고 넘어가기
* 기본 디비가 master로 되어있는데 이걸 꼭 Ewig 디비로 바꾸어 주어야함!! - 자주하는 실수
- 코드는 상수로 만들어 쓰는게 좋은 방법
- chinook의 genre도 int로 넣어있음!
- 첫번째는 int형이고 두번째는 nvarchar 이런걸 lookuptable?? 이라부름
* code류의 테이블을 다모아서 Code테이블을 만들면 좋음!
- 두개의 테이블만있으면 여러타입을 모두 처리할 수 있음! -(그런데 지금 연결이 안되있는데 어떻게 코드를,,?)
* 투표가 언제 닫히느냐?
1) 반장이 만들고 닫고
2) 모든 학생이 투표하면 닫히는
2번을 따를 때, Date, PlayerCount를 넣어놓고 PlayerCount에 맞는 투표가 있을때 투표가 닫히게끔!
지금부터는 데이터 다뤄보깅
SQL - 1) DDL
2) DML - [CRUD] CREATE, READ, UPDATE, DELETE
procedural(절차적) vs set-based(집합이론-데이터베이스)
db에서는 1명을 지우나 1000명을지우나 똑같음 !!!!
* 디비 주석
- 디비 공부
microsoft docs 이걸 보시길! - 현존하는 완벽한 설명!!..
- BNF -> 어떤 언어의 규칙을 설명하기위한,,,!
1.
2.
3. 실행 단축키 F5
4. 토마스만 실행하고 싶을 때
5. 아이디사양을 켜서 자동 증가하도록 해보자 - 이럴땐 아이디 값을 지정하면 안됨
6. 위처럼 김태희를 해버리면 모든 이름이 다 김태희로 바뀌어버림 그렇기때문에,,, WHERE 절이 있는 것,,,,
7. 삭제,,
8. SELECT
프로시저 (함수)
함수는 반환값이 있는데
프로시저는 어떤 일을 하긴하지만 반환값이 없음!
왜 사용? - 프로시저는 거의 장점만있음! 무조건 만들어 쓰기1
1. 아래보다 복잡한 코드 만들기 위해 프로시저 만들어놓고 호출하기!!!
2. 코드 구현하기
3. 뷰 만들기
트랜잭션 (OR, NOTING)
커서는 굉장히 성능이 안좋음 - SQL이랑 안맞음
트리거 - 이것도 가급적,,,, 사용을 자제,,,,,
인덱스 - 각 컬럼에 달 수있음
ex) 트랙테이블 - select * from track albumId = 1 이런경우에 db가 처음부터 쭉 훑는 수밖에 없음 그런데 이때 albumId에다가 인덱스를 붙여주게 되면 시간이 비약적으로 축소됨!!
> 기본키 설정하는 곳에 인덱스키가 있음! > 추가 > 컬럼명(오름/내림차순) > 다음부터는 상당히 빠르게 검색이 됨!
-> 인덱스만 잘 써도 성능이!! 쭊 올라감!! ..
-> 가장 단가높게 일하고 돈받는 사람,, db 튜닝하는 사람
단점 : 책으로 비유하자면 더 많은 페이지, 많은 시간, 새 페이지가 추가되면 목차(인덱스)도 또 바뀌어야함
또한 여, 남의 경우 성비가 50:50이거나 두개 중에 한개인경우는 사실 걸어도 차별성이 없음!
=> 잘 분산되어있는 데이터에 인덱스를 걸어주어야 함!!!!
'Archive' 카테고리의 다른 글
0926 C#과 DB 연동 프로그래밍 : EWIG 02 (0) | 2019.09.26 |
---|---|
0926 C#과 DB 연동 프로그래밍 : EWIG 01 (0) | 2019.09.26 |
0924 서버프로그래밍 (0) | 2019.09.24 |
0906 10-인터페이스 (0) | 2019.09.06 |
0906 09-가상메서드-추상메서드 (0) | 2019.09.06 |