기술 면접에서 들었던 질문을 간단하게 정리해봤다. 아는 것도 있었고, 모르는 것도 있었고, 알지만 설명하기 어려운 것들도 있었고...!
너무 장황하거나 초보같이 보이지 않기 위해, 간단하게 용어들을 섞어 설명하려고 정리했다.
Mongo db를 물어보셔서, 어떤 애인지 간단하게만 정리한다. NoSQL 데이터베이스는 단순 검색 및 추가 작업을 위한 매우 최적화된 키 값 저장 공간이다.
관계형 데이터베이스에 비해 설계의 단순성을 가지고, 더 단순한 수평 확장(관계형 데이터베이스의 문제)이 가능하다.
NoSQL 데이터베이스에 의해 사용되는 자료 구조(예: 키-값, 와이드 컬럼, 그래프, 도큐먼트)들은 관계형 데이터베이스에서 기본적으로 사용되는 것들과는 다르며 일부 작업들은 NoSQL에서 속도가 더 빠른 편이다.
참고 링크: database 관계형 DB와 비관계형 DB의 차이점
[DB]SQL(관계형 데이터베이스)과 NoSQL(비 관계형 데이터베이스) 개념/비교/차이
특징
장점
단점
특징
장점
단점
1–1. NOSQL의 종류
1)키-밸류 스토리지형 키-밸류형: Redis
, memcached, Oracle, Coherence,
2)열 지향 와이드 컬럼 스토어: Cassandra, HBASE, Cloud Database
3) 문서형: MongoDB
, Couchbase, MarkLogic, PostgreSQL, MySQL, DynamicDB MS-DocumentDB
4) 그래프형: Neo4j
책을 예를 들어 설명해보면? 1000 페이지(100페이지씩 10챕터) 중 'Alchemist'라는 단어를 갖고 있는 챕터를 찾기 위해서 나을 때까지 모든 페이지를 Full table scan을 해야 한다.
하지만 index 페이지가 있으면 해당 단어를 찾아 적혀있는 페이지로 바로 이동하면 된다. index가 10장정도라고 할 때 책은 총 1010장으로 페이지수가 증가하긴 하지만, 검색 속도를 빠르게 향상시킬 수 있다는 장점이 있다. (참고 링크)
Thus, the index is a separate section that stores values of indexed column + pointer to the indexed row in a sorted order for efficient look-ups.
DBMS에서 foreign key를 당연하게 사용하고 있었는데, 막상 왜 쓰는지에 대해서 물어보니 말문이 막혔다. 영문명은 content reference로, 데이터베이스에 있는 데이터를 참조할 때 데이터 레코드의 주소나 위치에 의해서가 아니라 사용자가 요구하는 데이터 내용으로 찾는 것을 말한다.
외래키는 테이블과 테이블을 연결하고, 중복을 방지하기 위해서 사용된다. (참고 링크)
면접에서 물어보진 않았지만, DB index를 검색하다 나온 개념이어서 추가 검색.
프로그래밍 언어에서 다른 변수, 혹은 그 변수의 메모리 공간주소를 가리키는 변수를 말한다. 포인터가 가리키는 값을 가져오는 것을 역참조라고 한다.
Queryset을 가져올 때 related objects까지 다 불러와주는 함수다. 불러온 data들은 모두 cache에 남아있게 되므로 DB에 다시 접근해야 하는 수고를 덜어줄 수 있다. 이렇게 두 함수 모두 DB에 접근하는 수를 줄여, performance를 향상시켜준다.
ForeignKey와 정참조와 역참조
- FK를 가진 클래스에서 가지지 않는 클래스를 참조할 때는 정참조
- FK를 가지지 않은 클래스에서 가진 클래스를 참조할 때는 역참조
N+1 Problem은 쿼리 1번으로 N건의 데이터를 가져왔는데 원하는 데이터를 얻기 위해 이 N건의 데이터를 데이터 수 만큼 반복해서 2차적으로 쿼리를 수행하는 문제다. 이 문제의 해결방식으로 Eager-Loading방식이 있다.
어플리케이션에서 한번의 호출로 N개의 모델을 가져온 뒤 N개의 모델을 순회 하면서 각각 모델 관련된 릴레이션 모델에 접근 할 때, DB에 또 다시 호출하게 되는데 이때 N번 호출하게 되어 성능에 좋지 않는 영향을 끼치게 됩니다.
예제 코드(참고 링크)
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
def __str__(self):
return self.name
class Restaurant(models.Model):
place = models.OneToOneField(Place, on_delete=models.CASCADE, related_name='restaurant')
name = models.CharField(max_length=50)
severs_pizza = models.BooleanField(default=False)
def __str__(self):
return self.name
>>> for place in Place.objects.all():
... print(place.restaurant.name)
...
TestRestaruant1
TestRestaruant2
TestRestaruant3
TestRestaruant4
TestRestaruant5
TestRestaruant6
# 쿼리를 찍어봤을 때
[{'sql': 'SELECT @@SQL_AUTO_IS_NULL', 'time': '0.000'},
{'sql': 'SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED', 'time': '0.000'},
{'sql': 'SELECT `photo_place`.`id`, `photo_place`.`name`, `photo_place`.`address` FROM `photo_place`', 'time': '0.000'},
{'sql': 'SELECT `photo_restaurant`.`id`, `photo_restaurant`.`place_id`, `photo_restaurant`.`name`, `photo_restaurant`.`severs_pizza` FROM `photo_restaurant` WHERE `photo_restaurant`.`place_id` = 1 LIMIT 21', 'time': '0.000'},
{'sql': 'SELECT `photo_restaurant`.`id`, `photo_restaurant`.`place_id`, `photo_restaurant`.`name`, `photo_restaurant`.`severs_pizza` FROM `photo_restaurant` WHERE `photo_restaurant`.`place_id` = 2 LIMIT 21', 'time': '0.000'},
{'sql': 'SELECT `photo_restaurant`.`id`, `photo_restaurant`.`place_id`, `photo_restaurant`.`name`, `photo_restaurant`.`severs_pizza` FROM `photo_restaurant` WHERE `photo_restaurant`.`place_id` = 3 LIMIT 21', 'time': '0.000'},
{'sql': 'SELECT `photo_restaurant`.`id`, `photo_restaurant`.`place_id`, `photo_restaurant`.`name`, `photo_restaurant`.`severs_pizza` FROM `photo_restaurant` WHERE `photo_restaurant`.`place_id` = 4 LIMIT 21', 'time': '0.000'},
{'sql': 'SELECT `photo_restaurant`.`id`, `photo_restaurant`.`place_id`, `photo_restaurant`.`name`, `photo_restaurant`.`severs_pizza` FROM `photo_restaurant` WHERE `photo_restaurant`.`place_id` = 5 LIMIT 21', 'time': '0.001'},
{'sql': 'SELECT `photo_restaurant`.`id`, `photo_restaurant`.`place_id`, `photo_restaurant`.`name`, `photo_restaurant`.`severs_pizza` FROM `photo_restaurant` WHERE `photo_restaurant`.`place_id` = 6 LIMIT 21', 'time': '0.000'}]
ORM에서 명령을 실행할 때마다 데이터베이스에서 데이터를 가져오는 것이 아니라, 모든 명령 처리가 끝나고 실제로 데이터를 불러와야 할 시점이 왔을 때 데이터베이스에 쿼리를 실행하는 방식이다. (참고 링크)
Eager-Loading방식은 사전에 쓸 데이터를 포함하여 쿼리를 날리기 때문에 비효율적으로 늘어나는 쿼리 요청을 방지할 수 있다.
user = User.objects.all()
parent = user.prefetch_related('parent') # parent를 가져오는 쿼리를 사전에 날림
위 N+1쿼리를 검색하다가 잘 정리한 글이 있어서, 질문 받진 않았지만 넣어본 ORM의 장단점.
django는 full stack framework인 반면, flask 가볍고 확장 가능한 framework이다.
사이더(Classless Inter-Domain Routing, CIDR)는 클래스 없는 도메인 간 라우팅 기법으로 1993년 도입되기 시작한, 최신의 IP 주소 할당 방법이다. 사이더는 기존의 IP 주소 할당 방식이었던 네트워크 클래스를 대체하였다.
CIDR 기법은 사이더 블록이라 불리는 그룹으로 IP 주소들을 그루핑하고 그룹들을 계층적으로 관리함으로써 기존의 Network Class 방식에 비해 유연하게 동작할 수 있도록하며, IP 주소 체계를 보다 효율화한다.
CIDR 네트웍 주소는 다음과 같은 형태로 나타내어 진다. 192.30.250.00/18
인터넷 사용자의 로컬 네트워크를 식별하기 위해 ISP(인터넷 서비스 공급자)가 제공하는 IP 주소이다. 공용 IP 주소라고도 불리며 외부에 공개되어 있는 IP 주소이다.
일반 가정이나 회사 내 등에 할당된 네트워크의 IP 주소이며, 로컬 IP, 가상 IP라고도 한다. IPv4의 주소부족으로 인해 서브넷팅된 IP이기 때문에 라우터에 의해 로컬 네트워크상의 PC 나 장치에 할당된다.
I really enjoy simply reading all of your weblogs. Simply wanted to inform you that you have people like me who appreciate your work. Definitely a great post. Hats off to you! The information that you have provided is very helpful.
http://www.rituwalia.in/category/dating-escorts-delhi.html
http://www.rituwalia.in/category/slim-escorts-delhi.html
http://www.rituwalia.in/category/big-boobs-delhi.html
http://www.rituwalia.in/category/north-indian-escorts-delhi.html
http://www.rituwalia.in/category/russian-escorts-delhi.html
Thank you so much for doing an impressive job here, everyone will surely like your post.
http://www.delhi37.in/sexy-rajouri-garden-escort/
http://www.delhi37.in/beautiful-faridabad-escorts/
http://www.delhi37.in/bold-connaught-place-escorts/
http://www.delhi37.in/classy-call-girls-janakpuri/
I wanted to leave a little comment to support you and wish you a good continuation. Wishing you the best of luck for all your blogging efforts.
http://monikaroy.in/
http://monikaroy.in/mahipalpur-call-girls-services/
http://monikaroy.in/south-delhi-call-girls-service/
http://monikaroy.in/paharganj-call-girls-service/
Call girl In New Delhi is well defined to meet certain expectations of many customers. It is considered to be some perfect times of intimate romance to be coming on with the exclusive red hot models.
https://www.dipikadelhi.com/
https://participez.villeurbanne.fr/profiles/dipika_delhi/activity
https://www.growkudos.com/profile/dipika_delhi
https://atelierdevosidees.loiret.fr/profiles/dipika_delhi/activity
https://akniga.org/profile/dipikadelhi/
https://heylink.me/dipikadelhi/
https://fundrazr.com/profiles/kishor-kumar
https://ladyoak.com/user/dipikadelhi69/
https://sites.google.com/view/russiancallgirlsinthelalithote/home
https://ladyoak.com/user/dipikadelhi69/
https://forasafercardiff.com/forums/users/dipikadelhi/
https://lookbook.nu/dipikadelhi
https://www.autoviva.com/bio.php?id=25848
http://www.print3dforum.com/member.php/39055-dipikadelhi
https://www.trainsim.com/vbts/member.php?602195-dipikadelhi
https://www.dead.net/member/dipikadelhi
https://bresdel.com/dipikadelhi
https://my.desktopnexus.com/dipikadelhi/
http://www.socialbookmarkssite.com/bookmark/4572233/new-delhi-escorts-service/
https://community.tccwpg.com/dipikadelhi
http://www.video-bookmark.com/bookmark/5577619/escort-service-rate-new-delhi-9899900591-call-girls-agent-new-delhi/
I really enjoyed reading this post, big fan. Keep up the good work and please tell me when can you publish more articles or where can I read more on the subject?
http://riya-panjaban.in/
http://www.bhubaneswarescorts.in/
https://www.modelescortsindelhi.com/delhi-call-girls-photos.html