🌟Database🌟

GyungHo GoΒ·2020λ…„ 5μ›” 14일
0
post-thumbnail

Database 기초 이해 및 μ„€μΉ˜

λ°μ΄ν„°λ² μ΄μŠ€λŠ” 데이터λ₯Ό μ €μž₯ 및 λ³΄μ‘΄ν•˜λŠ” μ‹œμŠ€ν…œμ΄λ‹€. Applicationμ—μ„œλŠ” 데이터가 λ©”λͺ¨λ¦¬ μƒμ—μ„œ μ‘΄μž¬ν•œλ‹€. 데이터λ₯Ό μ €μž₯ν•˜κ³  μ—°μƒν•˜κ³  λ³΄μ‘΄ν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•œλ‹€. 이에 λ°˜λŒ€λ˜λŠ” κ°œλ…μ—λŠ” λ©”λͺ¨λ¦¬κ°€ μžˆλ‹€. λ©”λͺ¨λ¦¬λŠ” νœ˜λ°œμ„±μ΄λ‹€. ν•΄λ‹Ή μ• ν”Œλ¦¬ μΌ€μ΄μ…˜μ΄ μ’…λ£Œν•˜λ©΄ λ©”λͺ¨λ¦¬μ— 있던 데이터듀은 λ‹€μ‹œ 읽어 λ“€μΌμˆ˜ μ—†λ‹€. ν•˜μ§€λ§Œ 속도가 λΉ λ₯΄λ‹€λŠ” μž₯점이 μžˆλ‹€. 그럼으둜 데이터λ₯Ό μž₯κΈ°κ°„ μ €μž₯ 및 λ³΄μ‘΄ν•˜κ³  μ ‘κ·Ό 및 관리가 νŽΈλ¦¬ν•˜κΈ° λ•Œλ¬Έμ— 데이터 베이슀λ₯Ό μ‚¬μš©ν•˜λŠ” 것이닀.

일반적으둜 Databaseμ—λŠ” 크게 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(RDBMS)와 "NoSQL"둜 λͺ…μΉ­λ˜λŠ” λΉ„κ΄€κ³„ν˜•(Non-relational) databaseκ°€ μžˆλ‹€.

κ΄€κ³„ν˜• 데이터 베이슀(RDBMS, relational Database Management System)

이름 κ·ΈλŒ€λ‘œ, κ΄€κ³„ν˜• 데이터 λͺ¨λΈμ— 기초λ₯Ό λ‘” 데이터 베이슀λ₯Ό λ§ν•œλ‹€. κ΄€κ³„ν˜• λ°μ΄ν„°λž€ 데이터λ₯Ό μ„œλ‘œ μƒν˜Έκ΄€λ ¨μ„±μ„ 가진 ν˜•νƒœλ‘œ ν‘œν˜„ν•œ 데이터λ₯Ό λ§ν•œλ‹€.

λͺ¨λ“  데이터듀은 2차원 ν…Œμ΄λΈ”(Table)λ“€λ‘œ ν‘œν˜„λœλ‹€. κ°κ°€μ˜ ν…Œμ΄λΈ”μ€ 컬럼(column)κ³Ό 둜우(row)둜 κ΅¬μ„±λœλ‹€.

  • μ»¬λŸΌμ€ ν…Œμ΄λΈ”μ˜ 각 ν•­λͺ©μ„ λ§ν•œλ‹€. ν–‰μœΌλ‘œ μƒκ°ν•˜λ©΄ λœλ‹€.
  • λ‘œμš°λŠ” 각 ν•­λͺ©λ“€μ˜ μ‹€μ œ 값을을 이야기 ν•œλ‹€. μ—΄λ‘œ μƒκ°ν•˜λ©΄λœλ‹€.
  • 각 λ‘œμš°λŠ” μ €λ§Œμ˜ 고유 ν‚€(Primary Key)κ°€ μžˆλ‹€. 주둜 이 Primary Keyλ₯Ό ν†΅ν•΄μ„œ ν•΄λ‹Ή 둜우λ₯Ό μ°Ύκ±°λ‚˜ 인용(reference)ν•˜κ²Œ λœλ‹€.

각 ν…Œμ΄λΈ”λ“€μ€ μ„œλ‘œ μƒν˜Έ 관련성을 가지고 μ„œλ‘œ 연결될 수 μžˆλ‹€. ν…Œμ΄λΈ” 끼리의 μ—°κ²°μ—λŠ” 크게 3가지 μ’…λ₯˜κ°€ μžˆλ‹€.
one to one, one to many, many to many
λŒ€ν‘œμ μΈ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€λŠ” MySQLκ³Ό PostgreSQL(μ€„μ—¬μ„œ Postgres)κ°€ μžˆλ‹€.

One To One

ν…Œμ΄λΈ” A의 λ‘œμš°μ™€ ν…Œμ΄λΈ”B의 λ‘œμš°κ°€ μ •ν™•νžˆ μΌλŒ€μΌ 맀칭이 λ˜λŠ” κ΄€κ²Œλ₯Ό onetoone 관계라고 ν•œλ‹€.

μœ„μ— λ‚˜μ˜¨ ν…Œμ΄λΈ”μ€ Userν…Œμ΄λΈ”κ³Ό μœ μ € 정보가 λ‹΄κΈ΄ User_profiles ν…Œμ΄λΈ”μ΄ μžˆλ‹€. 이런 κ΄€κ³„λŠ” ν•œλͺ…μ˜ μœ μžλŠ” ν•˜λ‚˜μ˜ ν”„λ‘œνŒŒμΌ μ•„μ΄λ””λ§Œ κ°€μ§ˆμˆ˜ μžˆλ‹€λŠ” λœ»μ΄λ‹€.

One To Many

ν…Œμ΄λΈ” A의 λ‘œμš°κ°€ ν…Œμ΄λΈ” B의 μ—¬λŸ¬ λ‘œμš°μ™€ 연결이 λ˜λŠ” 관계λ₯Ό λ§ν•œλ‹€.

μΌλŒ€λ‹€ 라고 λΆ€λ₯Έλ‹€. ν•˜λ‚˜μ˜ 정보λ₯Ό μ—¬λŸ¬κ°œμ˜ 데이터가 μ—°κ²° κ΄€κ²Œλ₯Ό 지을 수 μžˆλŠ” 것을 μ˜λ―Έν•˜λŠ”λ° ν•΄λ‹Ή μ˜ˆμ‹œλŠ” 고객이 μ—¬λŸ¬λ²ˆμ˜ 주문을 ν•  수 있고, ν•΄λ‹Ή 주문의 연결은 ν•΄λ‹Ή 고객 ν•œλͺ…에 ν•œμ •λœλ‹€. ν•˜λ‚˜μ˜ 주체가 μ—¬λŸ¬κ°œμ˜ μƒνƒœκ°’μ„ κ°€μ§€λŠ” 것을 μ˜λ―Έν•œλ‹€. ν•˜λ‚˜μ˜ μΉ΄ν…Œκ³ λ¦¬μ— 그에 ν•΄λ‹Ήν•˜λŠ” μ—¬λŸ¬ μ œν’ˆλ“€μ΄ λ“€μ–΄μžˆλŠ” 것도 λ§ˆμ°¬κ°€μ§€ 관계이닀.

Many To Many

ν…Œμ΄λΈ” A의 μ—¬λŸ¬ λ‘œμš°κ°€ ν…Œμ΄λΈ” B의 μ—¬λŸ¬ λ‘œμš°μ™€ 연결이 λ˜λŠ” κ΄€κ²Œλ₯Ό λ§ν•œλ‹€.

ν•˜λ‚˜μ˜ 책에 μ—¬λŸ¬λͺ…μ˜ μ €μžκ°€ μ‘΄μž¬ν•œλ‹€κ³  ν•˜λ©΄ μ±…μ˜ 정보λ₯Ό 가지고 μžˆλŠ” 뢁 ν…Œμ΄λΈ”κ³Ό μ €μžμ˜ 정보λ₯Ό κ°€λ””κ³  μžˆλŠ” authors ν…Œμ΄λΈ”μ΄ 각각 μ°Έμ‘° λ˜μ–΄μ„œ 쀑간 ν…Œμ΄λΈ”μΈ authors_books ν…Œμ΄λΈ”μ— κΈ°λ‘λœλ‹€. authors_booksν…Œμ΄λΈ”μ€ μ˜€λ”μ˜ 아이디와 μ±…μ˜ 아이디λ₯Ό 각각 μ°Έμ‘°ν•΄ μ˜¨λ‹€. μ΄λ ‡κ²Œ μ €μž₯λ˜μ—ˆμ„ λ•Œ ν˜„μž¬ κ°€μš΄λ° μ˜€λ”μŠ€ 뢁 ν…Œμ΄λΈ”μ—λŠ” μ–΄λ–»κ²Œ μ €μž₯될까. μ±…μ˜ 아이디와 μ €μžμ˜ 아이디가 μ—¬λŸ¬λ²ˆ 기둝 될 수 μžˆλ‹€. ν•˜λ‚˜μ˜ μ±… 아이디에 μ—¬λ €λͺ…μ˜ μ €μžμ˜ 아이디λ₯Ό κΈ°λ‘ν• μˆ˜ μžˆλ‹€. μ΄λŸ¬ν•œ 관계λ₯Ό Many To Many, λ‹€λŒ€λ‹€ 관계라고 ν•œλ‹€.

μ–΄λ–»κ²Œ ν…Œμ΄λΈ”κ³Ό ν…Œμ΄λΈ”μ„ μ—°κ²°ν•˜λŠ”κ°€?

Foreign Key(μ™ΈλΆ€ν‚€)λΌλŠ” κ°œλ…μ„ μ‚¬μš©ν•˜μ„œ 주둜 μ—°κ²°ν•œλ‹€. Foreign keyλŠ” κ³ μœ κ°’μ΄λ‹€. μœ„μ—μ„œ λ³Έ one to one μ˜ˆμ—μ„œ user_profiles ν…Œμ΄λΈ”μ˜ user_id μ»¬λŸΌμ€ users ν…Œμ΄λΈ”μ— κ±Έλ €μžˆλŠ” μ™ΈλΆ€ 킀라고 μ§€μ •ν•œλ‹€.
즉, 데이터 베이슀 μ—κ²Œ user_id의 값은 usersν…Œμ΄λΈ”μ˜ id 값이며 κ·ΈλŸ¬λ―€λ‘œ users ν…Œμ΄λΈ”μ˜ id μ»¬λŸΌμ— μ‘΄μž¬ν•˜λŠ” κ°’λ§Œ 생성 될수 μžˆλ‹€.
만일 users ν…Œμ΄λΈ”μ— μ—†λŠ” id 값이 user_id에 μ§€μ •λ˜λ©΄ μ—λŸ¬κ°€ λ‚œλ‹€.

μ™œ ν…Œμ΄λΈ”λ“€μ„ μ—°κ²°ν• κΉŒ?

μ™œ 정보λ₯Ό μ—¬λŸ¬ ν…Œμ΄λΈ”μ— λ‚˜λˆ μ„œ μ €μž₯ν•˜λŠ”μ§€λ₯Ό 생각해 보자. μœ„μ—μ„œ λ³Έ one to many의 경우 κ·Έλƒ₯ ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ— 고객 정보와 κ΅¬μž…ν•œ μ œν’ˆ 정보 λͺ¨λ‘ μ €μž₯ν•˜λ©΄ μ•ˆλ κΉŒ? ν•˜λ‚˜μ˜ ν…Œμ΄λΈ”μ— λͺ¨λ“  정보λ₯Ό λ‹€ λ„£μœΌλ©΄ λ™μΌν•œ 정보듀이 λΆˆν•„μš”ν•˜κ²Œ μ€‘λ³΅λ˜μ–΄ μ €μž₯λœλ‹€. 더 λ§Žμ€ λ””μŠ€ν¬λ₯Ό μ‚¬μš©ν•˜κ²Œ 되고, λ˜ν•œ 잘λͺ»λœ 데이터가 μ €μž₯될 κ°€λŠ₯성이 높아진닀.

μ—¬λŸ¬ ν…Œμ΄λΈ”μ— λ‚˜λˆ μ„œ μ €μž₯ν•œ ν›„ ν…Œμ΄λΈ” 끼리 μ—°κ²° μ‹œν‚€λ©΄ μœ„μ˜ λ¬Έμ œκ°€ 사라진닀. μ€‘λ³΅λ˜ 데이터λ₯Ό μ €μž₯ν•˜μ§€ μ•ŠμŒμœΌλ‘œ λ””μŠ€ν¬λ₯Ό 더 효율적으둜 μ“°κ³ , λ˜ν•œ μ„œλ‘œ 같은 λ°μ΄ν„°μ§€λ§Œ λΆ€λΆ„μ μœΌλ‘œ ν‹€λ¦° 데이터가 μƒκΈ°λŠ” λ¬Έμ œκ°€ 없어진닀. 이것을 normalization 이라고 ν•œλ‹€.

ACID(Atomicity, Consisitency, Isolation, Durability)

  1. μ›μžμ„±(Atomicity)
    νŠΈλžœμž­μ…˜κ³Ό κ΄€λ ¨λœ μž‘μ—…λ“€μ΄ λΆ€λΆ„μ μœΌλ‘œ μ‹€ν–‰λ˜λ‹€κ°€ μ€‘λ‹¨λ˜μ§€ μ•ŠλŠ” 것을 보μž₯ν•˜λŠ” λŠ₯λ ₯이닀.
    예λ₯Όλ“€μ–΄, 자금 μ΄μ²΄λŠ” 성곡할 수 도 있고, μ‹€νŒ¨ν•  수 λ„μžˆμ§€λ§Œ λ³΄λ‚΄λŠ” μͺ½μ—μ„œ λˆμ„ λΉΌμ˜€λŠ” μž‘μ—…λ§Œ μ„±κ³΅ν•˜κ³  λ°›λŠ” μͺ½μ—μ„œ λˆμ„ λ„£λŠ” μž‘μ—…μ„ μ‹€νŒ¨ν•΄μ„œλŠ” μ•ˆλœλ‹€.
    μ›μžμ„±μ€ 이와같이 μ€‘κ°„λ‹¨κ³„κΉŒμ§€ μ‹€ν–‰λ˜κ³  μ‹€νŒ¨ν•˜λŠ” 일이 없도둝 ν•˜λŠ” 것이닀.
  2. 일관성(Consistency)
    νŠΈλžœμž­μ…˜μ΄ 싀행을 μ„±κ³΅μ μœΌλ‘œ μ™„λ£Œν•˜λ©΄ μ–Έμ œλ‚˜ μΌκ΄€μ„±μžˆλŠ” 데이터 베이슀 μƒνƒœλ‘œ μœ μ§€ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€.
  3. 고립성(Isolation)
    νŠΈλžœμž­μ…˜μ„ μˆ˜ν–‰ μ‹œ λ‹€λ₯Έ νŠΈλžœμž­μ…˜μ˜ μ—°μ‚° μž‘μ—…μ΄ 끼어듀지 λͺ»ν•˜λ„둝 보μž₯ν•˜λŠ” 것을 μ˜λ―Έν•œλ‹€. 이것은 νŠΈλžœμž­μ…˜ 밖에 μžˆλŠ” μ–΄λ–€ 연산도 μ€‘κ°„λ‹¨κ³„μ˜ 데이터λ₯Ό λ³Ό 수 μ—†μŒμ„ μ˜λ―Έν•œλ‹€. 은행 κ΄€λ¦¬μžλŠ” 이체 μž‘μ—…μ„ ν•˜λŠ” 도쀑에 쿼리λ₯Ό μ‹€ν–‰ν•˜λ”λΌλ„ νŠΉμ • κ³„μ’Œκ°„ 이체 ν•˜λŠ” μ–‘ μͺ½μ„ λ³Ό 수 μ—†λ‹€. κ³΅μ‹μ μœΌλ‘œ 고립성은 νŠΈλžœμž­μ…˜ 싀행내역은 연속적이어야 함을 μ˜λ―Έν•œλ‹€.
  4. 지속성(Durabuility)
    μ„±κ³΅μ μœΌλ‘œ μˆ˜ν–‰λœ νŠΈλžœμž­μ…˜μ€ μ˜μ›νžˆ λ°˜μ˜λ˜μ–΄μ•Ό 함을 μ˜λ―Έν•œλ‹€. μ‹œμŠ€ν…œλ¬Έμ œ, DB 일관성 체크 등을 ν•˜λ”λΌλ„ μœ μ§€λ˜μ–΄μ•Ό 함을 μ˜λ―Έν•œλ‹€. μ „ν˜•μ μœΌλ‘œ λͺ¨λ“  νƒœν•Έμž­μ…˜μ€ 둜그둜 남고 μ‹œμ„Έν‹ˆ μž₯μ•  λ°œμƒ μ „ μƒνƒœλ‘œ 되돌릴수 μžˆλ‹€. νŠΈλžœμž­μ…˜μ€ λ‘œκ·Έμ— λͺ¨λ“  것이 μ €μž₯된 ν›„μ—λ§Œ commit μƒνƒœλ‘œ κ°„μ£Ό 될 수 μžˆλ‹€.

νŠΈλžœμž­μ…˜(Transaction)

ACIDλ₯Ό μ œκ³΅ν•¨μ— λ”°λΌμ„œ νŠΈλžœμž­μ…˜(일련의 μž‘μ—…λ“€μ„ ν•œλ²ˆμ— ν•˜λ‚˜μ˜ unit으둜 μ‹€ν–‰ν•˜λŠ” 것)κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.
νŠΈλžœμž­μ…˜μ€ 일련의 μž‘μ—…λ“€μ΄ 마치 ν•˜λ‚˜μ˜ μž‘μ—…μ²˜λŸΌ μ·¨κΈ‰λ˜μ–΄μ„œ λͺ¨λ‘ λ‹€ μ„±κ³΅ν•˜κ±°λ‚˜ μ•„λ‹ˆλ©΄ λͺ¨λ‘ λ‹€ μ‹€νŒ¨ν•˜λŠ”κ±Έ μ˜λ―Έν•œλ‹€.
commit & rollback

에λ₯Όλ“€μ–΄, μΉœκ΅¬μ—κ²Œ 인터넷 λ±…ν‚ΉμœΌλ‘œ λ§Œμ›μ„ μ†‘κΈˆν•œλ‹€κ³  ν•΄λ³΄μž. λ‚΄ κ³„μ’Œμ— λ§Œμ›μ„ μ°¨κ°ν•˜κ³ , 친ꡬ의 κ³„μ’Œμ— λ§Œμ›μ΄ 증가 λ˜μ–΄μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ 친ꡬ κ³„μ’Œμ— λ§Œμ›μ΄ μ¦κ°€λ˜μ§€ μ•ŠμœΌλ©΄ λ§Œμ›μ€ μ¦λ°œλ˜λŠ” 것이닀. μ΄λŸ¬ν•œ 상황이 λ°œμƒν•˜μ§€ μ•Šλ„λ‘ 쀑간에 였λ₯˜κ°€ λ°œμƒν•œλ‹€λ©΄ λ‹€μ‹œ μ²˜μŒλΆ€μ²˜ μ‹€ν–‰ν•˜κ²Œ ν•˜λŠ” 것이 rollback이닀. 였λ₯˜ 없이 μ •μƒμ μœΌλ‘œ μ†‘κΈˆμ΄ λ˜μ—ˆλ‹€λ©΄ commitν•œλ‹€.

profile
κΈ°λ‘ν•˜λŠ” μŠ΅κ΄€

0개의 λŒ“κΈ€