Loading [MathJax]/jax/element/mml/optable/MathOperators.js

보통 외래키는 관계형 데이터베이스에서 무결성을 유지하기 위해서 사용합니다. 저는 테이블 간의 관계를 명시하기 위해서 사용하기도 하였습니다.


아직까지는 진행하는 프로젝트들이 규모가 작고 개인으로 하는 것들이 위주라서 주로 MySQL을 사용해왔습니다. mysql은 관계형 데이터베이스다보니 테이블의 개수가 많아지면 외래키를 사용하는 경우가 가끔 있었는데 외래키와 관련된 무결성 제약조건 때문에 애를 먹었던 적이 많았습니다. 


얼마 전에 친구가 mysql 외래키에 대해서 물어봤을 때 다 까먹어서 제대로 대답하지 못했습니다. 그래서 자료를 찾다가 왜 외래키를 사용하는지 궁금해졌습니다. 그리고 흥미로운 사실을 알 수 있었습니다. 


현업에서는 외래키를 잘 사용하지 않는다는 것이었습니다. 대부분 로직이 수시로 바뀌어서 프로그램이 바뀌면 무결성 때문에 DB의 구조도 바꿔야 되서 업무량이 엄청 늘어나기 때문이었습니다. 저도 웹 프로젝트를 진행하면서 미숙한 설계로 프로그램에 변동이 자주 있었는데 그 때마다 FK로 걸었던 참조 무결성이 가끔씩 오류를 터뜨려줘서 꽤나 고생했어서 공감이 되었습니다.


당연히 현업에서 DB를 논리적 설계 단계에서는 FK가 존재합니다만 그것을 실제로 DB에서 구현할 때에는 명시하지 않고 프로그램의 로직을 무결성을 유지하도록 짠다고 합니다. 그리고 JOIN 등을 이용하여 FK를 사용한 것과 같은 기능을 구현할 수 있다고 합니다.


이렇게 하는 이유는 현실적인 번거로움 뿐만 아니라 성능 개선의 측면도 있습니다. SELECT, DELETE를 할 때에는 상관 없지만 INSERT, UPDATE를 할 때 FK를 사용하면 약간 느려진다고 합니다.


하지만 결제 시스템과 같이 굉장히 중요한 데이터를 다룰 때에는 무결성을 유지하기 위해서 FK를 사용한다고 합니다. 즉, 상황에 따라 융통성있게 사용한다는 것이죠. 그리고 DB에서 무결성을 보장해주지 않는 대신 어플리케이션 단에서 확실히 처리를 해야할 것입니다.


사실 제가 진행하는 프로젝트는 규모가 그렇게 크지도 않고 성능 차이가 확 와닿을 정도로 데이터가 많은 것도 아니라서 FK를 사용할 생각이기는 합니다만... 왠만하면 중요한 테이블에만 달고 다른 것들에는 편의를 위해서 생략하지 않을까 생각합니다.

'데이터베이스' 카테고리의 다른 글

우분투 16.04 msyql 설치 및 utf-8 설정  (0) 2016.12.20
[데이터베이스] mysql join  (0) 2016.12.05
회복 다시 정리  (0) 2016.11.29
트랜잭션과 회복  (0) 2016.11.16
블로그 이미지

NCookie

,

[수학] Chain Rule

수학 2017. 1. 3. 10:20

체인 룰에 대해 공부한 내용들을 정리하겠습니다.



1. 합성함수


우선 체인 룰에 대해서 설명하기 전에 합성함수에 대해 알아야 합니다.


별로 어려운 개념은 아닙니다.


간단하게 말해서 f(t) 함수의 매개변수가 g(x) 라는 함수의 결과값인 함수를 말합니다.


즉, t=g(x) 이므로 f(g(x)) 와 같이 표현할 수 있을 것입니다.


(fg)(x) 라고도 표현할 수 있습니다.



예시를 들어보면, f(t)=2t+1 이고 g(x)=x2 이라고 하겠습니다.


위 식에서 x=3 일 때, 


f(t)=f(g(x)) 

=f(x2)=2(x2)+1=2x2+1 

=19 이 될 것입니다.


합성함수는 별로 어려운 개념이 아니기 때문에 설명은 이 이정도로 마치겠습니다.



2. 체인 룰


미분의 기본적인 개념을 알고 있다고 가정하고 설명하겠습니다.


체인 룰은 두 함수를 합성한 합성 함수의 도함수에 관한 공식입니다. 

(https://ko.wikipedia.org/wiki/%EC%97%B0%EC%87%84_%EB%B2%95%EC%B9%99)


그 공식은 다음과 같습니다.


(fg)(x)=(f(g(x)))=f(g(x))g(x) 


체인룰은 변수가 여러 개일 때, 어떤 변수에 대한 다른 변수의 변화율을 알아내기 위해 쓰인다고 합니다.



3. 증명


두 가지 방법을 설명할 것인데 첫 번째는 미분의 정의를 이용하여 증명하는 것입니다.


y=f(g(x)) 일 때,

y=limh0f(g(x+h))f(g(x))h

=limh0f(g(x+h))f(g(x))g(x+h)g(x)limh0g(x+h)g(x)h

=f(g(x))g(x)


위에서 lim 이 두 개로 나뉘어진 이유는 다음과 같습니다.


limxaf(x)=A,limxag(x)=B일 때, 


limxaf(x)g(x)=AB 인 성질을 이용한 것이라고 이해하시면 될 것 같습니다.




두 번째 증명은 극한을 이용하는 것입니다. 


y=f(t) 이고 t=g(x)이고 Δt0 라고 할 때,


ΔyΔx=ΔyΔtΔtΔx 입니다.


위의 식은 딱히 의미가 있는 것이 아니라 증명을 하기 위한 장치라고 생각하시면 될 것 같습니다.


여기서 y=f(t),t=g(x) 모두 미분가능하므로, 


limΔt0ΔyΔt=dydt,limΔx0ΔtΔx=dtdx


미분가능한 함수 t=g(x)는 연속이므로 Δx0Δt0 입니다. 따라서 다음이 성립하게 됩니다.



dydx=limΔx0ΔyΔx


=limΔx0(ΔyΔtΔtΔx)=limΔx0ΔyΔtlimΔx0ΔtΔx=limΔt0ΔyΔtlimΔx0ΔtΔx


=dydtdtdx



위의 식 \frac{\Delta y}{\Delta x} = \frac{\Delta y}{\Delta t} \cdot \frac{\Delta t}{\Delta x} 은 단순히 상수끼리의 곱이었지만 \frac{dy}{dx}=y'=\frac{dy}{dz} \cdot \frac{dz}{dx}=f'(g(x)) \cdot g'(x) 은 라이프니츠 표기법으로, 편의를 위해 분수처럼 계산한 것일뿐  실제로는 나눗셈 연산이 불가능합니다. 



참고로 위의 증명과 그를 뒷받침하기 위한 증명 또한 KHAN ACADEMY에서 자세히 설명하고 있습니다.


위키피디아에서는 위의 방법들을 포함한 다양한 증명에 대해 설명하고 있습니다.


4. 예시


간단한 문제 몇 개를 풀어보겠습니다.


Ex1) y = (x^2 + 7)^3


sol) z = x^2 + 7, y = z^3 라고 할 때,


\frac{dy}{dx} = \frac{dz}{dx} \cdot \frac{dy}{dz} 이므로


\frac{dy}{dx} = 2x(3z^2) = 6x(x^2 + 7)^2



Ex2) y = \frac{1}{(x^3 + 2x + 4)^5}


sol) z = x^3 + 2x + 4, y = z^-5 라고 할 때,


\frac{dy}{dx} = \frac{dz}{dx} \cdot \frac{dy}{dz} 이므로


(3x^2 + 2)(-5z^{-6}) = -5(3x^2 + 2)(x^3 + 2x + 4)^{-6} = \frac{-5(3x^2 + 2)}{(x^3 + 2x + 4)^{-6}}





참고


http://bhsmath.tistory.com/184


http://newsight.tistory.com/223


http://blog.naver.com/PostView.nhn?blogId=alwaysneoi&logNo=100171733834



블로그 이미지

NCookie

,

이전까지는 블로그에 수학 수식을 보여주기 위해 이미지를 복사하거나 업로드했지만 너무 비효율적이라고 생각해서 다른 방법을 찾게 되었고 MathJax라는 것을 알게 되었습니다.


MathJax는 HTML 문서에서 수학 수식을 표현할 수 있게 해주는 오픈소스 스크립트라고 합니다.


그리고 수식 입력은 LaTeX나 MathML로 할 수 있습니다.


적용 방법은 간단합니다. <head>...</head> 사이에 아래 코드를 삽입하면 됩니다.


1
2
3
4
5
6
7
8
<script type="text/x-mathjax-config"
      MathJax.Hub.Config({
	      tex2jax: {
		      inlineMath: [['$','$'], ['\\(','\\)']]
      }
</script>
<script type="text/javascript" 
src="https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>

여기서 중요한 것은 x-mathjax-config 가 MathJax.js 파일을 호출하는 코드보다 위에 있어야 한다는 것입니다.


x-mathjax-config는 MathJax를 사용할 때 설정 등을 할 수 있는 부분입니다.


기본적으로 MathJax를 사용하면 자동으로 줄바꿈이 됩니다. 그래서 줄바꿈을 하고 싶지 않다면 위와 같이 설정해주어야 합니다.



실제로 사용할 때 줄바꿈을 하고 싶다면 x = 0 ($$ 로 수식을 감싸면 됨)과 같이 하고 쭉 이어서 쓰고 싶으면 $ x = 1 $ ( $ 로 수식을 감싸서)로 하면 됩니다.


만약 MathJax가 제대로 적용이 되지 않는다면 편집기 말고 HTML 모드로 들어가서 사이에 다른 내용들이 없는지 확인합니다. 저 같은 경우에는 span 태그가 사이에 있어서 제대로 적용이 되지 않았었습니다.

' > JS' 카테고리의 다른 글

[웹][JS] HTML 코드에서 스크립트의 위치  (0) 2016.10.26
블로그 이미지

NCookie

,

구글링을 하다가 apt 명렁어를 이용하여 패키지를 다운받는 경우를 종종 봤습니다. 처음에는  단순히 apt-get 을 줄여놓은 것으로 생각했었는데 아니더군요.


사실 apt 와 apt-get 은 다른 패키지 관리자이지만 하는 일이나 명령어들은 거의 비슷합니다. (아예 코드부터가 다릅니다)


인터페이스는 약간 다릅니다. 그리고 apt-get이 먼저 나오고 apt 가 나중에 나왔습니다.


apt-get 과 apt-cache 를 하나의 명령어로 사용하기 위해 apt 가 탄생했다더군요.


결과적으로는 굳이 그 둘을 구분해서 사용하지는 않아도 된다는 것입니다.


이것도 마찬가지로 상황에 따라 달라질 수 있겠습니다만...

블로그 이미지

NCookie

,

코드를 작성한 파일의 이름이 sqlite3.py 이기 때문에 되지 않는 것입니다.


파일 이름을 다른 것으로 변경해주면 정상적으로 작동합니다.

블로그 이미지

NCookie

,