데이터베이스 정규화

데이터 베이스 정규화란? 관계형 데이터베이스에서 중복을 최소화하게 데이터를 구조화하는 작업. 중복된 데이터가 많으면 데이터를 삽입/수정/삭제할 때 예상치 못한 문제가 발생할 가능성이 높기 때문에 이런 문제를 예방하는 목적도 있음.

정규화에는 1차 정규화, 2차 정규화, 3차 정규화 등등 여러가지 방법이 있는데 쉽게 생각해서 큰 테이블을 중복된 데이터가 만들어지지 않게 작은 테이블로 쪼개는 작업들이라고 이해하면 된다.

1, 2, 3차 정규화 등등 설명은 다 생략하고, 실제로 예를들어 설명하면

ID학생학번강의 이름담당교수
1A2020101
2B2019102
3C2018103
4D2020101

이런 테이블이 있다고 가정해보자. 학생들이 있고 그 학생들이 듣는 강의 이름과 담당 교수가 작성된 테이블이다. 이때 101이라는 강의가 있고 이 담당 교수는 ‘가’이다. A,D학생이 동시에 듣고 있는 이 강의는 중복된 데이터가 입력되어있다. 만약 강의 이름을 변경해야할 때 101이라는 두개의 데이터를 모두 변경해야하고 혹시나 두 데이터가 모두 변경되지 않았을 경우 프로그램에서 오류를 발생시킬 수 있다. 이럴때 이 테이블을 두개로 나눠서 정규화 하는게 좋다는 것이다.

ID학생학번강의
1A20201
2B20192
3C20183
4D20201
ID강의 이름담당 교수
1101
2102
3103

학생 테이블과 강의 테이블을 나누고 외래키로 묶어서 관리해 중복된 데이터를 피했다. 이러면 강의 이름이나 담당 교수가 바뀌더라도 하나의 데이터만 바꾸면 된다. 이렇게 큰 테이블을 쪼개서 여러개의 테이블로 나누고 중복된 데이터를 없애는 것이(물론 정확히 말하면 데이터 정규화는 단순히 테이블을 쪼개는 것만 있는 것은 아니고 더 큰 작업이긴 하지만) 데이터 정규화이다.

Python에서 ‘is’와 ‘==’의 차이

Python 자체가 쉽고 언어가 그렇게 어려운편이 아니어서 그런지 나도 쓸때마다 너무 겉핥기로 알고있다는 생각을 많이 한다. 이미 시작은 해버렸고 이제 모르는건 바로바로 찾아서 깊게 아는게 중요!

오늘은 코드 짜다가 if문에 is를 썼는데 갑자기 is와 ==의 차이점이 궁금하다. 그 전엔 그냥 튜토리얼이 있으면 그대로 썼는데 문득 의문이 생긴다. is와 ==의 차이가 뭘까 분명히 뭔가 차이가 있을텐데…

정말 단순히 설명하면

  • is는 비교할 두 값이 같은 오브젝트 인스턴스라면 True를 반환
  • ==는 __eq__()매소드에 의해서 리턴값이 정해짐

 

https://stackoverflow.com/questions/26595/is-there-any-difference-between-foo-is-none-and-foo-none

https://stackoverflow.com/questions/132988/is-there-a-difference-between-and-is-in-python

이 두 답변을 보면 정확하게 이해가 되는데 Java를 생각한다면 string 비교할때 ==로 비교하면 안되고 .equals()였나… 이걸로 비교해야되는 것 같은 느낌?!

Python파일에서 Django설정 사용하기

웹 크롤링을 해서 Django에 데이터를 집어넣고 싶었다. 그런데 Python파일에서는 Django를 바로 못쓰네… 하던참에 해결방법 찾음!

Django 프로젝트 맨위에 python파일을 하나 만들고 Python파일에

[code lang=”python”]

os.environ.setdefault(‘DJANGO_SETTINGS_MODULE’, ‘기본 Django프로젝트 이름.settings’)
import django
django.setup()
from Django앱.models import 모델명

[/code]

이렇게 하면 Django에서 사용하던 모델을 그대로 사용할 수 있고! 모델 인스턴스 만들어서 save하면 바로 DB에 저장이 가능하다

Django에서 Form에 placeholder설정하기

Django를 사용하다보면 Form, ModelForm을 사용하는 일이 많이 생기는데 이럴 때 Input에 사용자들에게 입력하는 데이터를 설명할 수 있는 placeholder가 필요할 경우가 생긴다.

방법은 Field를 설정할 때 widget, attrs에 placeholder를 설정하는 방법이 있지만 나는 ModelForm을 사용하기 때문에 Field를 건들이고 싶지 않았다. 자동으로 생성해주니까… 그래서 __init__을 재정의해 placeholder를 넣는 방법이 있다.

placeholder.JPG

__init__을 재정의하고 일단 처음에 __init__을 실행시켜주고 그 다음에 내가 원하는 코드를 삽입한다.

self.fields['원하는 field명'].widget.attrs['placeholder'] = "원하는 문자열"

간단하죠?