docking window의 layout을 마음대로 정하기 위해 관련된 것을 정리

Layout을 결정하는 요소
  • Direction: Top, Bottom, Left, Right, Center
  • Position

  • Row

  • Layer

Posted by trigger
,
출처: http://stackoverflow.com/questions/523363/how-do-i-layout-a-3-pane-window-using-wxpython/523377

Posted by trigger
,
출처: http://bbs.python.or.kr/viewtopic.php?p=57251&sid=0c5abbc356c248019103c7d5154ddcc5

방법1. (권장)
코드분석 제대로 해서 필요한 부분만 가져다 쓴다.

방법2. (테스트 페널만 가져오고 싶을 때)
원래 방법1처럼 쓰라고 wxPythonDemo가 만들어 진 것이지만 실제로 자신이 만든 어플리케이션에 아무런 생각(?)없이 붙여서 실행해 보고 싶은 것이 인지상정.
wxPython프로그램은 log클레스를 사용해서 셈플 어플리 케이션의 이벤트를 추적해서 보여주는 기능이 있으므로 그대로 가져다 쓰면 제대로 안돌아감. 그래서 아래와 같이 log클레스를 정의해서 페널클레스의 인자로 호출해 주어야함.
코드:
 
     log=wx.Log
     dum= 페널클레스명(self,log)

실제 사용 예
코드:
 
   def OnButton1Button(self, event):
       log=wx.Log
       tp=TestPanel(self,log)

Posted by trigger
,

UI prototyping tool

project/design 2009. 2. 19. 14:10
진도는 느리지만, 달팽이 같은 속도로 프로그램을 만들고 있다. 만들며 보니 GUI 디자인이 필요한데, 다음과 같은 오픈소스 프로그램이 있어서 정리해 본다

Pencil http://www.evolus.vn/Pencil/Home.html
  • 원래는 파이어폭스 add on 프로그램인가 본데, standalone으로도 동작한다
  • 다운로드 받은 뒤에 풀고 pencil.bat를 실행하면 된다. 설치가 필요없다


Balsamiq http://www.balsamiq.com
  • 손으로 그린 것처럼 결과가 보인다
  • 밑의 비교자료에 의하면 배울 필요도 없이 직관적인 이용이 가능하다고 한다


위의 두가지를 포함해서 몇가지를 비교한 것
http://slgo.tistory.com/entry/프로토타이핑-툴의 장단점
Posted by trigger
,
Posted by trigger
,

wxPython Docs and Demo Tools
 
시작 > 프로그램 > wxPython Docs and Demo Tools > Run the wxPython DEMO


wxPython Docs, Demos, Samples
시작 → 프로그램 → wxPython2.8 Docs Demos and Tools → Run the wxPython DEMO 실행
시작 → 프로그램 → wxPython2.8 Docs Demos and Tools → Sample Apps 실행
설치 폴더\wxPython\samples\wxPIA_book\ - 다양한 Sample이 있음

References
시작 → 프로그램 → wxPython2.8 Docs Demos and Tools → wxWidgets Reference 실행
wxPython에서 지정되어 있는 Class, Function에 대한 설명과 사용법이 나와 있음
wxWindows와 wxPython의 정의가 거의 동일하므로 wxWindows References를 참조해도 됨

영문 튜토리얼
http://wiki.wxpython.org/
http://wiki.wxpython.org/index.cgi/AnotherTutorial 자세한 설명. 하나씩 배워가는 예제
http://zetcode.com/wxpython/ 간단한 예제들 위주로 설명되어 있음

모듈별로 분류된 설명서
http://www.wxpython.org/docs/api/wx-module.html 
http://docs.wxwidgets.org/stable/wx_classref.html#classref

Class hierarchy
http://docs.wxwidgets.org/trunk/classwx_window.html



예제 많은 한글 블로그
http://pythondev.egloos.com/tag/wxPython
http://www.myevan.net/category/2?TSSESSIONmyevannet=55912385191ad97f51ffc94f2e51b66b
http://withrobot.tistory.com/category/Python




Posted by trigger
,
1. 준비사항
Python이 설치되어 있어야 함

2. Eclipse 설치
http://www.eclipse.org/ 에서 다운받아서 설치한다. 설치과정은 특별한 것은 없고, 압축을 푸는 것으로 완료

3. Eclipse > Help > Software updates


오른쪽의 Add site를 클릭하고

Location에 http://pydev.sourceforge.net/updates/ 를 입력한다

업데이트를 시키면 eclipse가 pydev와 관련된 zip 파일을 자동으로 다운로드 & 설치한다.

4. Window -> Preferences -> Pydev -> Interpreter - Python -> Python Interpreters 옆에 New 클릭

파이썬이 설치된 폴더의 Python.exe 선택


위의 과정대로 하면 다음과 같은 창이 뜬다. 이것으로 셋업 완료


Test 화면


5. 한글 언어팩 설치
설치한 Eclipse가 3.4 이상의 버전이라면 다음과 같이 온라인으로 설치한다. Help의 Software Updates를 누른다


두번째 탭의 Available Software를 선택하고, Add Site를 누르고, http://download.eclipse.org/technology/babel/update-site/ganymede 를 입력한다.


Pending이라고 나오는데 좀 기다리면 언어팩 리스트가 뜨고 Korean을 선택한다


Eclipse를 재시작하라고 나온다. 변경된 것을 적용하려면 재시작해야 한다.


다음과 같이 한글화된 메뉴로 보인다.


소스코드내의 한글이 문제되는 경우

소스코드내에 한글이 있을 경우, 다음과 같은 에러 메시지가 뜬다.

SyntaxError: Non-ASCII character "blah blah..."

이 때는, 소스코드 제일 윗줄에 다음과 같이 입력한다

#-*- coding: euc-kr -*-

그리고, 메뉴 -> Window -> Preferences -> Workspace -> Text file encoding을 Other로 선택한후 combo box에 EUC-KR을 직접 타이핑해서 입력한다.


Posted by trigger
,
Posted by trigger
,
목적: Microsoft Access의 mdb 파일을 MySQL에서 ODBC(Open DB Connectivity)를 이용해서 가져다 쓰기 위한 것.

1. MySQL ODBC 드라이버를 설치

MySQL ODBC 드라이버는 MySQL 사이트에서 다운받을 수 있다.

2. 제어판의 관리도구를 선택하여 데이터 원본 (ODBC)을 더블클릭하면
밑의 ODBC데이터 원본 관리자가 표시된다.


3. 관리도구에서 데이터 원본 (ODBC) 를 선택


4. 사용자 DSN 또는 시스템 DSN을 선택해서 추가를 누른다.
사용자 DSN과 시스템 DSN의 차이는 아마도 여러명이 사용하는 컴퓨터일 경우에 발생할 텐데, 난 로컬호스트로 사용하고 혼자 사용하는 컴퓨터라서 시스템 DSN을 선택했다.



5. 추가를 누르고, MySQL ODBC 3.51 Driver 선택


[마침]버튼을 누르면 MySQL의 ODBC설정 창이 뜬다.

6. MySQL에 접속하기 위한 설정

Data Source Name에 DSN명을 넣고
Server는 자신의 컴퓨터에 MySQL이 설치되어 있으면 localhost를 입력한다(ODBC 설정 이전에 MySQL이 설치되어 있고, 데이터베이스가 생성되어 있어야 한다).

MySQL에 접속하기 위한 User명과 Password를 입력하고 Database의 컴보박스를 선택하면, MySQL에 만들어져 있는 데이터베이스가 표시된다. 그중에 자신이 쓸 데이터베이스를 선택한다.


위와 같이 세팅을 하고 Ok를 누르면 다음과 같이 제대로 잘 연결되었다고 나온다


이와 같이 Access 데이터를 MySQL로 포팅할 준비가 되었다면, 다음의 방법을 통해서 실제로 포팅할 수 있다.

1. Access를 열고, export하려는 테이블을 선택


2. 테이블 내보내기에서 MySQL ODBC를 선택한다.



위의 과정이 복잡하거나 어렵다면 다음의 프로그램을 사용해 보는 것도 나쁘지 않을 듯. 물론 난 안 써봤다.
http://www.bullzip.com/products/a2m/info.php

위의 설정과는 반대로, MySQL에서 직접 Access의 mdb를 ODBC를 통해서 접근하는 방법도 확인필요

MS SQL과 Python의 연동
http://www.time-travellers.org/shane/howtos/MS-SQL-Express-Python-HOWTO.html
Posted by trigger
,
발생하던 두가지 문제 정리

1. 현대증권 HTS인 스파이더에는 nProtect가 탑재되어 있다. 이 nProtect는 Avira Antivir에서는 바이러스 코드로 인식

해결방법: 스파이더를 쓰려면 어쩔 수 없이 nProtect를 써야만 한다. 별로 안 좋은 프로그램인 것은 알지만 방법이 없다. 그래서 Avira Antivir를 지우고, Avast로 대체. Avast는 nProtect를 바이러스로 인식하지 않는다.

2. 스파이더의 종목검색 > 데이터 파일받기가 안 되는 문제

해결방법: 스파이더의 메뉴중에서, 설정 > 환경설정 > 다운로드방식 > Active mode로 되어 있는 것을 Passive mode 로 바꾼다. 뭔가 FTP하고 연관이 되어 있는 것 같은데 이렇게 해야 제대로 동작한다.


Posted by trigger
,
서툰 목수의 연장탓

현재는 주로 PyScripter를 이용하고 있는데, 아직은 wxPython을 이용하고 있지 않아서이다. 디버깅을 하다가 기능이 좀 부족한 듯 싶어서 검색해 보니 다음과 같은 비교 리뷰가 있다.

A review of 6 Python IDEs
http://spyced.blogspot.com/2006/02/pycon-python-ide-review.html
http://spyced.blogspot.com/2005/09/review-of-6-python-ides.html

이 외에 또 다른 디버거로 다음과 같은 것이 있다.

Winpdb - A Platform Independent Python Debugger
http://winpdb.org/2008/04/a-call-for-contributions/
시험삼아 써보니 제법 괜찮은 듯. 에러 메시지가 좀 더 충실하게 나온다.

Posted by trigger
,

SQLite

project/DB & SQL 2009. 1. 8. 16:58
MySQL보다 적게는 2배, 크게는 10배까지도 빠르다고 한다. 프로젝트를 완성한 후에 이것으로의 migration을 고려해 보자

http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/SQLite 

Posted by trigger
,


발행회사 고유코드로 1993년 8월 30일을 기준으로 설립년도 순에 따라 00001부터 일련번호로 부여하고 그 후는 코드신청 순서에 따라 순차적으로 부여

주권종류코드 : 보통주 / 우선주 구분
단축코드의 경우는 보통주 0,  1우선주 5,  2우선주 7, ...

신주종류코드 : 구주 / 신주 구분
- 구주 0,  1신주 1,  2신주 2, ...

즉 0은 보통주, 5는 구형 우선주, 6,7,8 등은 신형 우선주, 1,2는 신주

Posted by trigger
,
출처: http://withrobot.tistory.com/180

글을 쓸 때는 다음과 같이 html 편집을 이용해서 소스코드를 입력한다

<textarea name="code" class="Python" cols="60" rows="10">
코드는 여기에 복사한다.
</textarea>
Posted by trigger
,

Farpy
http://farpy.holev.com/index.php 

PythonCard
http://pythoncard.sourceforge.net/ 
http://network.hanb.co.kr/view.php?bi_id=514 약간의 한글 설명
http://pythoncard.sourceforge.net/documentation.html 공식 document

wxDesigner
http://www.roebling.de 유료이다. 대부분의 평은 이것이 꽤 좋다고 말하고 있다.
http://www.cae.tntech.edu/help/programming/wxdesigner-getting-started/view wxDesigner Turotial

SPE
http://stani.be/python/spe/blog/ 
설치기 http://withrobot.tistory.com/160

VisualWX
http://visualwx.altervista.org/ 
http://visualwx.altervista.org/tutorial.php 튜토리얼. 플래쉬로 된 튜토리얼이 있음

wxGlade
http://wxglade.sourceforge.net/ wxGlade
wxGlade는 완전한 GUI 통합 개발환경이 아니라 화면에 보여지는 것만을 만들어준다.
완전한 통합 GUI 개발환경을 원한다면, Boa Constructor나 PythonCard가 좋을 것이다.
http://wiki.kldp.org/wiki.php/Wxglade-Tutorial 한글 wxGlade 튜토리얼
http://bebop.emstone.com/research/python/wxglade_eclipse/ 이클립스와 사용하는 방법

Boa Constructor
http://blog.bagesoft.com/entry/python-wxPython-GUI-boa-IDE-%EC%84%A4%EC%B9%98 
설명1 http://bebop.emstone.com/research/python/boa_constructor_tutorial/
설명2 http://freesearch.pe.kr/236?TSSESSIONfreesearchpekr=5ae5b40e71530e8c5af7abbe7c4a2da4 
간단한 사용설명서 http://www.superuser.co.kr/home/lecture/index.php?cateNo=4&secNo=10635

PAGE - Python Automatic GUI Generator
http://page.sourceforge.net/
http://sourceforge.net/projects/page


위의 몇가지 것들을 비교한 한국 파이썬 마을의 글
http://bbs.python.or.kr/viewtopic.php?p=38622&sid=83ea4e4ca36b06321fa45a065f4bb6a3

Posted by trigger
,
출처: www.dbguide.net

1. 프로세스모델
  1.1 프로세스모델의 정의
규모가 크고, 복잡한 업무를 분석할 때, 정해진 기간 내에 업무를 효율적으로 분석하여, 목표시스템에서 요구하는 기능을 만족할 수 있게 누락되거나 불필요한 업무를 골라내는 일이다. 또한 분석된 업무를 체계적으로 분류하여 목표시스템의 메뉴, 프로그램의 체계를 설계하여 품질이 우수한 시스템을 개발하는 일이 무엇보다도 중요하게 된다.
방법론을 사용하여 업무를 분석하면 업무를 체계적으로 정리하며, 누락되거나 불필요한 업무를 대부분 도출이 가능하게 됨은 물론, 데이터 모델을 작성하는 데에도 도움이 많이 된다.
주로 사용하는 프로세스 모델은 프로세스계층도(Process Hierarchy Diagram)가 있는데, 프로세스 계층도를 작성하기 위하여 간략한 설명과 작성절차 등을 설명하기로 한다.

  1.2 업무기능 분할(Business Function Decomposition)
업무 프로세스는 그 크기에 따라 기능영역(Function Area), 기능(Function), 프로세스(Process), 단위프로세스(Unit Process)로 상세화 수준(레벨; Level)I이 나뉘어진다. 예를 들면, 회계관리 업무는 기능영역, 재무회계관리, 세무회계관리는 기능이며 재무계획수립이나 법인세 산출은 프로세스이며, 재무제표자료 등록, 법인세 자료수정은 단위프로세스라고 할 수 있다.
프로세스계층도는 계획 단계에서부터 분석 단계까지 정보시스템화 대상이 되는 전체 업무영역을 계층적으로 표현하여 업무영역을 쉽게 이해하기 위하여 사용하는 기법이다. 사용자의 요구사항을 분석 시에 가장 어려운 문제는 업무기능을 적절하게 균형을 맞춰가며 구조적으로 분할하는 일이다.
이러한 작업은 분석자 개개인의 경험을 바탕으로 수행되고 있으나 그들의 견해와 관점의 차이로 말미암아 같은 업무를 분할한 결과가 일정하지 않고, 그 상세화 수준도 각각이다.
업무기능 분할은 대규모의 복잡한 업무영역을 분석하여 정보시스템을 구축하는데 매우 효과적인 방법이다. <그림2-1>은 기능 분할의 예이다. 통상적으로 정보시스템의 분석대상이 되는 기업이나 기관의 업무영역은 경영전략, 조직, 업무, 관련 자료로 이루어져 있다.

<그림2-1> 업무기능분할(Business Function Decomposition)의 예
이 중에서 업무를 좀 더 상세히 설명한다면, 업무는 기업이나 기관에서 실제로 사용중인 전사 업무처리 지침서, 사업장이나 부서의 업무처리 지침서 또는 부서원별 업무분장내역, ISO 매뉴얼 등에 나타나 있으며 그러한 자료들과 현업 실무자들과의 업무 면담 내용을 가지고 업무 분석을 하게 된다.
특정 부서의 업무는 타 부서와의 From/To 업무가 있고 부서만의 고유한 업무가 있다. 회사를 구성하는 전 부서의 업무를 통합하고 분류하면 전사적인 업무 구성도가 나온다. 회사의 전체적인 업무를 업무기능영역, 하위의 서브업무기능, 그리고 서브업무기능들은 다시 업무프로세스, 그리고 다시 더 이상 나뉘어 질 수 없는 단위프로세스로 나뉘어 지게 된다. 이러한 단위프로세스는 프로그램 모듈이 되는데, 프로그램 모듈의 처리 절차는 프로시저라고 부른다.
프로세스계층도는 업무를 체계적으로 분할하는 훌륭한 도구이면서 구축될 정보시스템의 메뉴체계가 된다. 기능 분할을 하는데 있어서 바람직한 접근 방법은 최상층에서부터 분할을 시작하는 상향식 접근방식과 최하층에서 유사 기능을 묶어서 체계화해 올라오는 상향식 접근방법을 적절하게 병행하는 것이다. 이 두 가지 접근 방법을 병행하는데 있어서 바람직한 방향은 우선 하향식 접근방법에 따라 전체 기능을 기능의 최하위 계층인 단위프로세스로 구성하고 그것들을 상향식 접근방식에 의해 유사한 것끼리 집단화(Aggregation)하고 분류화(Classification)하면서 상위 프로세스를 인위적으로 만들어내는 식으로 두 가지 방법을 병행하며 결과를 보완하는 것이다.

  1.3 프로세스의 종류
가. 기능영역(Function Area)
기능영역은 업무기능의 집합으로서의 의미를 가지나 일반 기업에서는 큰 의미를 가지지 않으며, 일반적으로 대기업에서의 "부문", "본부"등의 커다란 조직 단위에서 수행하는 업무 전체를 일컫는다고 할 수 있다. 그러나 이보다는 순수하게 업무기능의 상위 계층으로 업무기능의 그룹으로 생각하는 것이 좋다.

나. 업무기능(Business Function; Function)
업무기능 또는 기능은 기업이나 기관의 한 분야를 완전하게 지원하는 업무활동들의 집합이다.
일반적으로 해당 조직(부서)의 업무목표를 달성하기 위한 지속적이고도 정규적인 형태의 업무를 표현한다. 업무기능은 상위 계층의 업무활동이며, 한 기능을 구성하고 있는 액티비티 그룹은 일반적으로 유사한 업무 데이터를 사용하기 때문에 서로 관련되어 있다. 업무를 수행하는데 있어서 관련된 양식이나 보고서나 파일 등의 자료가 반드시 있기 때문이다.
  예) 경영 관리, 재무 관리, 자재 관리, 생산 관리, 영업 관리, 인적자원 관리

다. 업무프로세스(Business Process; Process)
업무프로세스는 잘 정의된 업무 활동들로 그것의 실행은 특정 엔티티(데이터)의 입력 및 출력으로 규정될 수 있다. 업무 기능이 지속적으로 이루어지는 활동으로 간주된다면, 이 업무 프로세스는 이러한 업무기능을 수행하기 위한 일시적인 특정 개별 업무이며, 특정한 시점과 종점을 가지고 있는 것이 특징이다.
  예) 프로젝트 계획수립, 프로젝트 계획변경

라. 단위프로세스(Unit Process; Primitive Process; Elementary Process)
단위프로세스는 프로세스를 구성하는 최하위 단위로 일반적으로 입력처리, 출력처리 등을 정의하고 있다. 보다 엄밀하게 말한다면, 특정 데이터의 항목에 대한 입력 또는 출력에 관계되는데 엔티티(파일, 테이블, 클래스 등)에 대한 4가지 기본 작업 즉, 신규생성, 수정, 삭제, 조회 중 한가지 작업을 규정하고 있다.
  예) 고객명단 확인(고객 엔티티의 조회), 주문상품 확인(상품 엔티티의 조회),
       주문내역 등록(주문내역 엔티티의 생성) 등

  1.4 분할 지침
기능 분할 작업을 수행 시에 유의해야 할 지침은 다음과 같다. 이러한 지침들은 업무를 자연스럽게 구조적으로 분할이 되게끔 하여주는 것으로서 분석가들은 명심해야 한다.
첫째,
업무프로세스를 업무가 발생하는 순서대로 상에서 하로 좌에서 우로 배치한다.
모든 업무는 시작과 끝이 분명히 있는 것으로써 같은 레벨이라도 업무가 먼저 일어나는 것을 우선적으로 배치하고 나중에 일어나는 것을 뒤에 배치한다.
둘째,
동일한 프로세스가 다른 부모 밑에서 여러 번 출현이 가능하다.
이른바 공통 프로그램 모듈이 되는 것으로서 특정 업무는 서로 다른 부모 레벨에서 여러 번 나타날 수 있다. '출고지시' 업무는 영업 업무에서도 나타날 수 있고, 생산 업무에서도 나타날 수 있으며, 구매 업무에서도 나타날 수 있다.
셋째,
부모마다 분할의 수준이 다를 수 있다.
같은 레벨에서도 업무프로세스와 단위프로세스, 업무기능 등이 같이 나타날 수 있다.
넷째,
분할의 최종 결과는 단위프로세스이다.
다섯째,
업무기능은 2개 이상의 업무기능 또는 2개 이상의 업무프로세스로 분할이 된다.
<그림2-2>는 프로세스계층도의 계층화 검증 그림이다.
(a)는 업무기능영역 바로 밑에 업무기능들이 나와야 하는데 업무프로세스가 나온 것이 잘못된 분석이다. 보통의 업무기능 분석 시에 이러한 일들이 자주 일어나는데 이러한 일이 발생하는 것은 업무기능 명, 업무프로세스 명을 명명하는 데에 잘못이 있었기 때문이다. (b)는 업무프로세스1 밑에 업무기능들이 위치하는 것이 잘못 되었으며, 업무프로세스2 밑에 단 하나의 업무프로세스가 위치한 것이 잘못된 것이다. (c)는 업무기능영역 밑에 하나의 업무기능이, 업무기능 밑에 단 하나의 업무프로세스가 위치한 것이 잘못 되었다.

<그림2-2> 프로세스 계층도(기능 분할도)의 계층화 검증
이렇게 업무영역을 단위프로세스까지 나누다 보면 업무와 관련된 자료도 자세하게 나누어지게 되어 자연스럽게 업무기능 및 관련된 자료와의 관계를 구할 수 있다.

2. 프로세스계층도 작성 사례
 
가. 채용업무 프로세스계층도 작성 예
시스템 분석가가 사용자의 요구사항을 분석할 때에 방법론의 도움이 없다면, 방대하고 복잡한 업무의 체계적인 정리와 더불어 하나도 빠짐없이 업무 규칙을 분석하는 일이 얼마나 어렵고 문제가 많이 발생할 것인지를 짐작하는 것은 어렵지 않은 일이다. 실제로 전문적이고 경험이 많지 않은 시스템 분석가가 사용자의 업무 요구사항을 분석하면서 방법론을 사용할 때 방법론의 강점을 피부로 느끼고 그것의 효과를 철저히 이해하면서, 방법론의 작성 지침에 따라 업무를 진행하지 못하는 경우가 대부분이다.
국내의 많은 시스템 개발자들이 방법론을 사용하여 시스템을 분석하는 것에 익숙하지 않은 것도 사실이다. 따라서 여기에 나와있는 사례들을 대상으로 실제로 실습을 해 볼 필요가 있다.
다음의 '채용업무'에 관한 문제공간을 가지고 기능 분할도(프로세스 계층도)를 작성하는 방법을 설명하기로 한다.

나. 문제공간
직원을 채용할 필요가 있을 때, 새로운 이력서와 보관되어 있는 이력서를 검토하여 명단을 작성한다. 명단에 등재된 각 후보들에 대하여 면담을 한다. 각 후보들은 반드시 교수나 전직장의 관리자가 작성한 추천서를 제출해야 한다. 제출된 추천서는 면담 후에 별도로 검토된다. 각 후보에 대한 채용 의사결정이 내려지고 난 후 한 명 이상의 후보가 채용된다.

다. 업무기능 분할 과정
<그림2-7>은 '채용업무'에 대한 기능 분할의 과정을 보여준다.
먼저 문제공간에서 가장 작은 업무의 단위인 단위프로세스를 도출해낸다. 단위프로세스는 대부분이 실체(Entity; 파일; 테이블; 클래스 등)가 되는 명사형 단어와 그 실체에 어떠한 행위(생성, 수정, 삭제, 조회 등)를 하는 동사형 단어의 형태인 명사+동사의 형태로 작성이 되되, 되도록 상세한 설명이 포함된 명사+동사로 작성한다.
<그림2-7>의 (a)는 초기 기능 분할도이다.

<그림2-7> '채용업무'에 대한 기능분할의 과정
대부분의 프로세스들이 단위프로세스들로 구성이 되어 있다. '채용업무'의 문제공간에서 우선은 업무기능으로부터 단위프로세스로 분석방향을 진행하는 것이 아니라, 단위프로세스로부터 업무기능으로의 하향식이 아닌 상향식의 접근방법을 우선적으로 사용한다.
작성된 단위프로세스가 더 이상 나누어질 수 없는 프로세스인지를 검증할 필요가 있다. 전술한 대로 단위프로세스는 하나의 입력자료와 하나의 출력자료를 가진다. 시스템 분석 초기에는 프로그램을 생각하지 않기 때문에, 단위프로세스와 관련된 입력 자료와 출력자료는 해당 업무와 관련된 자료 예를 들면, 장부, 원장(Ledger), 보고서, 증빙(영수증), 전표 등의 자료들을 생각해 본다.
그림에서 보면 '새로운 이력서 검토'라는 단위프로세스는 검토되지 않은 새로운 이력서가 입력되어 검토된 새로운 이력서의 출력자료가 만들어진다. 출력자료가 하나이상 만들어진다면 하위 단계로 더 나누어질 수 있으므로 그 프로세스는 단위프로세스가 아니라고 생각하면 된다. 이러한 단위프로세스들에서 유사한 종류의 프로세스들끼리 모아서 상위 프로세스를 만든다. 상위 프로세스는 한 레벨이 최대 12개의 프로세스를 넘지 않는 선에서 6-7 레벨로 나뉘어질 정도로 계층화가 이루어지면 가장 바람직한 분할이 이루어졌다고 볼 수 있다.
유념할 것은 시스템 분석가는 현업 실무자에게서의 업무 분석결과 이외에는 추측이나 상상에 의하여 업무프로세스를 추가하거나 함부로 누락시키지 말아야 한다는 것이다. 기능 분할도에 나타난 모든 단위프로세스는 거의 모두가 실제의 프로그램 모듈이 된다는 것을 생각한다면, 현업 실무자의 요청이 없었는데도 업무프로세스를 추가한다는 것은 정해진 프로젝트 기한을 지키지 못하는 일이 발생될 수도 있고 심지어는 현업 사용자가 활용할 수도 없고 운영할 수도 없는 프로그램을 제작하게 되는 우를 범할 지도 모르고, 업무 프로세스를 누락시키는 것은 더더욱 시스템을 완전하게 구축하지 못하는 일이 될지도 모른다.
원칙대로 기능 분할도를 작성하는 지침에 충실하여 작업을 수행하면 가장 만족스러운 시스템 분석작업이 이루어 질 수 있다는 것이다.
<그림2-7>의 (b)는 중간 과정의 기능 분할도를 나타내고 있다.
이때 아주 중요한 분할 지침은 프로세스의 이름을 균형 있게 명명하는 일이다. 어떤 노련한 분석가는 국어사전을 옆에다 놓고, 현업실무자까지 참여시켜 프로세스 이름을 지정한다고 하니 프로세스 명명이 기능분할도의 작성 나아가서는 시스템 분석의 성공적인 임무 수행에 얼마나 중요한 것인지를 짐작할 수 있겠다. 중간 기능 분할도처럼 단위프로세스를 식별하는 일부터 상향식으로 구조화된 기능 분할도는 어느 정도 유사한 업무프로세스들끼리 모아지면 반대의 하향식 접근방법으로 다시 말하면, 업무기능영역에서 업무기능으로, 다시 업무기능에서 업무프로세스로 계층화를 시킨다. 상향식과 하향식 접근식의 계층화를 반복적으로 하다 보면 만족스런 기능 분할이 이루어지게 된다.
<그림2-7>의 (c)는 완성된 최종 기능 분할도이다.

<그림2-7-c> 최종 기능 분할도

Posted by trigger
,
출처: www.dbguide.net

1. 데이터 모델
  1.1 데이터 모델의 정의
데이터의 집합을 기술하는데 사용되는 개념이며, 데이터를 조작할 수 있는 연산들의 모임을 의미한다. 데이터는 키(주 식별자)와 일반 칼럼(속성, Attribute)올 표현이 되며 키와 칼럼들이 모인 로우(레코드), 하나 이상의 로우가 모인 테이블(모델링 단계에서는 엔티티)이 되는데, 모든 용어들이 데이터의 표현에 사용된다.
  1.2 데이터 모델의 종류
가. 개념적 모델(Conceptual Model)
현실 세계의 업무규칙(업무처리흐름상의 규칙, 양식 등의 자료를 구성하는 데이터들의 상관관계 규칙)을 개략적으로 데이터 모델을 사용하여 표현을 하되, 각각의 사업장, 부서 등에 대해서 개별적인 데이터 모델이 작성될 수 있다.
나. 논리적 모델(Logical Model)
개념적 데이터 모델을 통합한 것으로써, 각각의 사업장, 부서 등의 데이터를 구성하는 속성들의
도메인(자릿수, 형태, 초기 값 등)이 통합되어 표현 된다.

논리적 데이터 모델은 특히 다음과 같은 특성을 가지고 있다.
데이터베이스 설계 시 사용
주어진 현실세계로부터 개념의 집합을 명세
높은 수준의 추상화에서 현실세계를 표현하는 도구
현실세계를 이해하기 쉽고 해석하기 쉽도록 현실세계를 명세

논리적 데이터 모델의 평가기준은 다음과 같다.
표현성(Expressiveness)
단순성(Simplicity)
최소성(Minimality)
정형성((Formality)

다. 물리적 모델(Physical Model)
논리적 데이터 모델과 비교한 물리적 데이터 모델의 특징은 다음과 같다.
특정 DBMS에 의해 지원됨
컴퓨터에 의해 처리될 수 있는 데이터 명세를 지원
종류 : 계층형 모델, CODASYL 모델, 관계형 모델

  1.3 데이터베이스 구축과정으로 본 데이터 모델의 의의
데이터베이스 구축과정은 현실세계의 데이터와 업무를 데이터 모델의 세계로 Mapping시키는 과정이라고 할 수 있다. 데이터베이스는 현실 세계의 데이터와 업무를 그들의 세계로 안내하는데 있어서 그들이 채택한 모델을 통하여 안내한다. 즉, 모델의 표현규칙, 작성규칙을 따라 현실세계의 자료와 업무가 표현된다. 다시 말하면 컴퓨터세계와 현실세계의 연결다리 역할을 하는 것이 바로 이 모델이다. 데이터베이스 관리시스템(DBMS) 또한 이 모델을 근거로 각종 자동화 처리기를 제작했다. 따라서, 데이터베이스 시스템을 구축 시에 필수적으로 그들이 채택한 데이터 모델에 대하여 정통할 필요가 있다.
2. 데이터 모델링
  2.1 데이터 모델링 절차
다음은 일반적인 데이터 모델링 절차이다.
일반론적인 데이터 모델링 절차 그림에서 '데이터 모델 콘테스트' 및 '업종별 표준 데이터 모델'의 제작과 관련하여 엔티티 정의, 관계 정의, 엔티티-관계도 작성, 주/부 식별자 정의, 외부 식별자 정의, 세부속성 정의에 대해서만 설명하기로 한다. 나머지 부분들은 일반 책자들에 잘 설명이 되어 있으므로 참고하기 바란다.
  2.2 엔티티 정의
가. 엔티티의 종류
엔티티의 종류는 독립 엔티티(Kernel Entity, Master Entity), 업무중심 엔티티(Transaction Entity), 종속 엔티티(Dependent Entity), 교차 엔티티(Associative Entity, Relative Entity)의 4종류로 분류된다.
1) 독립 엔티티(Kernel Entity, Master Entity)
    사람, 물건, 장소, 개념처럼 원래부터 현실세계에 존재하는 엔티티.
    예) 사원, 고객, 영업부, 창고, 생산계획, 계정과목 …

2) 업무중심 엔티티(Transaction Entity)
    업무가 실행되면서 발생하는 엔티티
    예) 주문, 납품, 대금청구, 대금지급 …

3) 종속 엔티티(Dependent Entity)
    주로 1차 정규화(1st Normalization)로 인하여 관련 중심엔티티로 부터 분리된 엔티티
    예) 주문품목, 납품품목 …

4) 교차 엔티티(Associative Entity, Relative Entity)
    다:다 관계를 해소하려는 목적으로 인위적으로 만들어진 엔티티

나. 엔티티의 자격조건
엔티티의 종류는 독립 엔티티(Kernel Entity, Master Entity), 업무중심 엔티티(Transaction Entity), 종속 엔티티(Dependent Entity), 교차 엔티티(Associative Entity, Relative Entity)의 4종류로 분류된다.

다. 엔티티의 예
다음 표는 엔티티의 사례를 보여주는 표이다.
① 사람 (사원(직원, 행원, 공원,…), 계약자(가입자, 회원,…), 이용자(학생, 환자,…))
② 물건 (재료(부품, 원자재, 연료, …), 상품(제품,…), 시설(건물, 창고, 운송센터,…), 지점(영업소, 소매점,…))
③ 사건 (계약(수주,발주,…), 작업(공정, 보관, 선전, 광고,…), 사고(재해, 고장,…))
④ 장소 (구획(창고, 선반, 진열케이스, 생산라인, …), 지역(판매구역, 관할구, 선거구,…), 하천, 항만(부두, 선창,…))
⑤ 개념 (목표, 계획(지침, 방침, 지표, 판매목표, 생산계획, 판매계획, 인원계획,…), 시간(월, 일, 년, 시각, 시각분할,…), 평가(기준, 지표))
⑥ 금전 (예입금(구좌,…), 예산(년간예산, 수정예산, 실행예산,…), 차입(단기, 장기,…), 융자(단기, 장기,…))

  2.3 관계(Relationship) 정의
가. 기수성(Cardinality)
기수성은 다음과 같이 정의된다.
1:1, 1:M, M:N 관계
해당엔티티 1건에 대한 상대엔티티의 기수성을 상대 엔티티쪽에 표기
표기 방법(James Martine 표기법)

나. 선택성(Optionality)
선택성은 다음과 같이 정의된다.
집합의미 (포함, 불포함)
1:0 (Optional), 1:1 (Mandatory)
해당엔티티 1건에 대한 상대엔티티의 기수성을 상대엔티티쪽에 표기
표기 방법(James Martine 표기법)

다. 관계의 완성 : 기수성과 선택성의 통합 [James Martin]
기수성과 선택성을 통합하면 관계가 완성이 된다.
해당 엔티티를 기준으로 기수성의 경우의 수와 선택성의 경우의 수를 합하여 최소값과
  최대값의 경우의 수를 구한 후 해당 엔티티쪽에 최대값을 바깥쪽에 최소값을 표기한다.
상대 엔티티도 유사한 방법으로 표기한다.

라. 관계의 완성 사례
다음은 '고객'엔티티와 '주문'엔티티에 대하여 관계를 작성하는 절차를 보여주는 사례이다.
기수성 : 각 고객은 하나 이상의 주문을 할 수도 있고 안 할 수도 있다.
선택성 : 각 주문은 고객이 하는 것도 있고 그렇지 않을 수도 있다. (사원이 할 수도 있다.)

관계를 완성할 때 흔히 나올 수 있는 경우에 대한 대처 방법을 설명하기로 한다.
첫째, 기수성과 선택성의 통합 시 다:다 관계가 나올 수가 있는데 이는 Table Join이 안되므
        로 (외부 키의 표시가 불능) 교차 엔티티를 이용하여 표기한다.

둘째, 관계는 두 엔티티간의 업무규칙(Business Rule)을 토대로 인위적인 방법으로 기수성
        과 선택성을 구하여 이를 통합하여 완성된다.

셋째, 관계(Relationship) 표기의 의미는 두 엔티티 중에서 외부키(Foreign Key)가 놓이는
        자식 엔티티를 구분하기 위한 것이 첫째 임무이다. 외부키는 부모엔티티의 기본키(Pri
        mary Key)가 되기 때문이다. 둘째 임무는 외부키 무결성(관계무결성)을 구하기 위한
        것이다.

넷째, 기수성 표기, 선택성 표기, 관계통합 표기 방법이 각 교수나 RDBMS 업체에 따라 다를
        수 있는데 큰 문제가 되지 않는다. 왜 관계(Relationship)를 구하는 가의 이유만 알면
        되기 때문이다.

  2.4 엔티티-관계도(Entity Relationship Diagram)의 작성
가. 작도방법
다음은 엔티티-관계도를 효과적으로 작성하는 기법을 설명하기로 한다.
사각형의 도형 안에 엔티티명을 기록
업무흐름의 진행순서와 관련된 엔티티는 진행순서를 고려하여 좌에서 우 또는 상에서 하로   중심부에 배열 ("주문"→ "출고")
중심에 배열된 엔티티와 관계를 가진 연관엔티티(종속엔티티)를 가까운 쪽으로 배열
  ("주문" : "주문품목", "출고" : "출고품목")
배열된 엔티티와 관계를 갖는 핵심엔티티(Kernal Entity)를 외곽으로 전개
  ("주문", "고객", "영업담당자", "창고", "품목", "제품")
해당엔티티의 한 건에 대한 상대엔티티의 기수성(Cardinality)을 상대 엔티티쪽에 표기함으
  로써 관계의 기수성을 표기 :
해당엔티티의 한 건에 대한 상대엔티티의 선택성(Optionality)을 상대 엔티티쪽에 표기함으
  로써 관계의 선택성을 표기 :

나. 주요성공요소
엔티티-관계도를 작성하는데 있어서 주요성공요소는 다음과 같다.
엔티티를 식별하고, 관계를 도출한 후 ERD작도법에 맞추어 ERD를 작성
업무흐름 및 업무규칙의 ERD작도 시 활용

다. 엔티티-관계도와 관련된 실무적인 의미 및 검증기준
다음은 엔티티-관계도의 실무적인 의미와 작성시 유의사항이다.
첫째, 엔티티-관계도는 데이터베이스의 형상(Schema)을 결정하는 매우 중요한 그림이다.
둘째, 엔티티-관계도는 업무흐름을 나타낼 수 있어야 하며, 중요한 데이터속성들이 모두 표현되어 있어야 한다. 따라서 엔티티-관계도는 표현규칙 및 작성규칙에 충실하게 따라서 작성이 되어야 한다.
셋째, 엔티티-관계도를 그리다 보면 선이 겹치는 경우가 많이 발생하는데, 이는 상기한 작도방법을 따르지 않은 것으로 많은 문제를 야기할 수 있다.

다음은 실무적으로 엔티티-관계도를 효과적으로 작성하는 절차이다.
엔티티의 배열
관계의 연결
기수성 정의 (기수성명 표기)
선택성 정의 (선택성명 표기)
기수성과 선택성의 통합 : 엔티티-관계도의 완성
관계가 다:다일 경우에 교차엔티티를 이용하여 일대다로 분리함

다음은 엔티티-관계도의 검증기준이다.
작성규칙 및 데이터모델 표현규칙 적합성, 단순성, 확장성, 비중복성, 공유성
모든 속성의 표현
관계표기의 적합성
사용자의 데이터요구(화면, 보고서 등)에의 성능 우수성

  2.5 주식별자(Primary Identifier, primary Key, 주키) 정의
다음은 주식별자에 대한 정의절차이다. 이해하기 쉬우므로 간략하게 절차만 설명한다.
 
각 엔티티별로 하나의 주식별자 선택
후보 식별자 중 가장 중요한 하나를 주식별자로, 나머지를 대체키로 지정
Subtype엔티티의 주식별자는 Supertype엔티티의 주식별자와 동일하게 선택
데이터 이름에 대한 표준약어목록의 이용

  2.6 외부식별자(Foreign Identifier, Foreign Key, 외부키) 정의
가. 외부식별자의 특징
외부식별자는 다음과 같은 특징을 가진다.
두 엔티티간의 관계를 결정하여 주는 속성으로 관계에 의한 자식엔티티에 위치하며 부모엔
  티티의 주식별자가 같은 값을 갖는다.
논리적 데이터 모델내의 모든 관계에 관련된 외부키를 규명한다.

나. 외부식별자의 표기 사례
다음 그림은 외부식별자의 표기 예를 보여준다.

  2.7 속성 정의
가. 속성 정의
속성이란 엔티티를 구성하는 더 이상 분리될 수 없는 정보단위로 식별자 종류(기본, 대체, 외부 키)와 비식별자(non-key)로 구분한다.

나. 효과적인 속성 정의방법
다음과 같은 방법으로 속성을 찾아 정의한다.
정보 분석단계에서 수집된 각종자료 참조
엔티티, 관계 정의시 파악
기존 정보시스템 분석 - 관련 DB나 file의 field
속성의 이름을 부여 - 표준화 규칙 사용, 자료사전에 기록

다. 속성 정의 예
다음 표는 제품 엔티티에 대한 속성 정의 예이다.
엔티티 속성 속성유형 식별자구분 비고
제품 제품코드 설계 PK
  제품명 기초  
  기대수요 기초    
  재주문요구 기초    

  2.8 데이터 모델 검증 및 주요성공요소
가. 데이터 모델 검증 방법
데이터 모델 검증은 아래와 같은 범위의 품질기준에 맞추어 검증한다.
Group Check
Business rule에 의한 완전한 이해와 E-R Modeling에 대한 완전한 이해를 가진 숙련된 분석가가 최선의 답이며, Project 팀 내의 동료끼리 상호 모델을 Check하고 오류를 찾아 본다.
사용자(End User) 확인
정기적으로 사용자에게 모델을 제시하면서 확인하거나, 사용자를 참여시켜 Error와 누락된 것을 check한다.
업무규칙(Business Rule)
엔티티품질 검증
속성품질 검증
관계품질 검증
완전성 검증
사용자 INTERVIEW, 서류양식, 장표, 보고서 등과 비교 점검하여 추가되거나 누락된 것이 없는지를 확인하고, 향후 입력, 출력보고서가 모두 적용될 수 있는지를 점검한다.

나. 주요성공요소
데이터 모델링을 잘하기 위하여 다음과 같은 내용들을 숙지한다.
첫째,
분석단계의 Data Modeling(산출물: Logical ERD)과 설계단계(산출물: Physical ERD)의 구분
Business Rule이 같기 때문에 분석단계의 ERD(Entity로 표시)와 설계단계의
  ERD(Table로 표시)의 근본구조는 달라지지 않는다.
분석단계의 ERD에서 약 20%내외만이 수정이 되어 설계단계의 ERD로 바뀐다.
설계단계에서는 성능(Performance)을 고려한 Summary, Duplicate, Processin
  g Table이 만들어진다.
둘째,
엔티티-관계도(ERD) 작성 및 검증요령
현재의 장표, 양식, 업무 매뉴얼, 보고서, 사용자인터뷰 내용 등에서 Entity추출
  기준 (정보관리대상, 유일한 키의 존재, 키 이외의 속성 가질 것) 엔티티(Entity)
  를 추출 하여 적어 놓는다.)
엔티티 사이의 Business Rule을 분석하여 그들 사이의 관계를 찾는다.
관계유형>
▶ Dynamic flow(업무흐름도에 의존 :주문→생산지시→제품입고 → 출고 →납품)
▶ Static flow(데이터 자체의 관계 : BOM Type, Super-Sub Type)
▶ Transient flow(시간이 가면 변하는 것 : 정산-미정산 분개의 확정 시점)
향후 입력화면, 출력보고서가 현재의 ERD에서 추측될 수가 있고 계산하기 편한
  가 등의 기준으로 엔티티-관계도를 검증한다.
세째,
엔티티(Entity, Table)를 분해한 후 합칠 수 있다
엔티티-관계도 작성시 핵심엔티티(독립엔티티, 코드엔티티 : kernel Entity)를
  구별함
Sub-system만 제작한 다음 나중에 통합할 수 있다.
네째,
엔티티-관계도를 제대로 못 그리는 이유 : Business Rule을 제대로 분석하지 못했기 때문
Business Rule에 숨어있는 Data를 분석해내지 못했고 그들 Data사이의 관계를
  분석하지 못했기 때문
ER 방법론 미 숙지
Business Rule해독 90%, ER방법론 숙지 10%
다섯째,
관계형 데이터베이스 모델링은 속성(Attribute)끼리의 Logical Model이다
속성(Attribute끼리의 Business Rule → Relationship
물리적 의미(Physical meaning) → Relational Key(외부키)의 정의
여섯째,
관계형 데이터베이스는 속성(Attribute)접근 방식이지 Pointer접근방식(COBOL문의 OCCURS, Redefine)이 아님, 즉 같은 TYPE의 속성은 중복되면 안 된다.
일곱째,
엔티티-관계도(ERD)작성시 속성 검출 및 정규화 유의사항
속성(Attribute)은 가장 최소로 자른다. (예 : 년월일→년, 월, 일)
주키(Primary Key)가 나누어지는 것은 분석이 잘못되었기 때문이다
1차, 2차, 3차 정규화를 잘 할 것
여덟째,
다대다(Many to Many)관계가 해소되어야 하는 이유와 해소 방법
속성(Attribute)사이에만 관계(Relationship)가 생성하는데, Many to Many는
  관계를 맞출 수가 없다.
비교엔티티 (연결엔티티, 교차엔티티)를 집어넣어준다
  : 양쪽의 엔티티(Entity)와 속성(Attribute)이 서로 key나 Data부분의 속성
  (Attribute)으로 들어가기만 하면 된다.
아홉째,
Logical Design(Data중심)과 Physical Design(사용하는 DBMS, System 중심)을 완전히 분리할 것
Summary Table은 Relationship으로 표시가 불가하다.
(Logical Data Modeling에서는 표시가 안됨)
Physical개념 : Processing 개념
열째,
엔티티-관계도 (ERD)를 작성시 Top-Down과 Bottom-up을 병행하면서 진행한다. 왜냐하면 Entity의 분할과 Attribute의 상세한 define이 발생하기 때문이다.
열한째,
엔티티-관계도 작성시 선택성(Optionality)을 구분해줄 필요가 있으나 치명적이지 않다.
 

 

Posted by trigger
,
http://www.bubbl.us
무료이고 직관적이고 쉽게 이용가능하다. 한글도 지원되며 팀으로도 이용이 가능한 것으로 보인다. 확대/축소도 자유롭다.

http://www.mindmeister.com/
Basic은 무료

http://www.mindomo.com/index

Basic account(무료)는 한번에 저장할 수 있는 맵이 7개로 제한된다.
Premium account는 월 6$username: trigger1

http://mind42.com/
가입하면 모든 기능을 free로 사용 가능. 작성한 마인드맵을 데스크탑용 마인드맵 프로그램인 freemind 포맷(*.mm-한글은 깨진다)으로 내보낼 수 있다. freemind는 자바 어쩌고를 깔아서 돼서 좀 귀찮다.

설치형 프로그램인 Freemind는 http://cafe.naver.com/usboffice.cafe 에서 구할 수 있다.
Posted by trigger
,
 INDEX의 의미?

RDBMS에서 검색속도를 높이기 사용하는 하나의 기술입니다.
INDEX는 색인입니다. 해당 TABLE의 컬럼을 색인화(따로 파일로 저장)하여 검색시 해당 TABLE의 레코드를 full scan 하는게 아니라 색인화 되어있는 INDEX 파일을 검색하여 검색속도를 빠르게 합니다.

이런 INDEX는 TREE구조로 색인화합니다. RDBMS 에서 사용하는 INDEX는 Balance Search Tree 를 사용합니다.실제로는 RDBMS 에서 사용되는 B-Tree 는 B-Tree 에서 파생된 B+ Tree 를 사용한다고 합니다.

참고로 ORACLE이나 MSSQL에서는 여러종류의 TREE를 선택하여 사용가능하다.

INDEX의 원리?

INDEX를 해당 컬럼에 주게 되면 초기 TABLE생성시 만들어진 MYD,MYI,FRM 3개의 파일중에서 MYI에 해당 컬럼을 색인화 하여 저장합니다. 물론 INDEX를 사용안할시에는 MYI파일은 비어 있습니다. 그래서 INDEX를 해당컬럼에 만들게 되면 해당컬럼을 따로 인덱싱하여 MYI 파일에 입력합니다. 그래서 사용자가 SELECT쿼리로 INDEX가 사용하는 쿼리를 사용시 해당 TABLE을 검색하는것이 아니라 빠른 TREE로 정리해둔 MYI파일의 내용을 검색합니다.

만약 INDEX를 사용하지 않은 SEELCT쿼리라면 해당 TABLE full scan하여 모두 검색합니다.

이는 책의 뒷부분에 찾아보기와 같은 의미로 정리해둔 단어중에서 원하는 단어를 찾아서 페이지수를 보고 쉽게 찾을수 있는 개념과 같습니다. 만약 이 찾아보기 없다면 처음부터 끝까지 모든 페이지를 보고 찾아야 할것입니다.

INDEX의 장점?

보통 INDEX를 사용하지 않은 select쿼리와 INDEX를 사용한 쿼리의 검색속도는 6.5배가 차이납니다.이는 데이타양이 많아질수록 더욱더 차이납니다.

INDEX의 단점?

1.디스크용량 감소

인덱스를 사용하명 MYI파일에  추가 입력되기 때문에 디스크용량이 늘어납니다. 모든컬럼을 인덱스하면 데이타파일보다 인덱스파일이더 커질수도 있습니다. 적당하게 사용해야 합니다.

인덱스를 사용해도 디스크 용량은 염려할 정도로 많이 안먹으며 그에 비해 대부분의 경우는 퍼포먼스의 향상을 가져오게 되므로 좋은점이 더 많습니다.

2.INSERT,UPDATE속도 저하

해당 TABLE에 INDEX을 주게되면 INSERT,UPDATE가 조금 느려집니다. 왜냐하면 매번 해당 table과 table의 index를 검사해야 하기때문에 해당 table만 검사했을때보다 느리다.

INDEX의 목적?

RDBMS에는 INDEX가 있습니다. 인덱스의 목적은 해당 RDBMS의 검색 속도를 높이는데 있습니다.

SELECT 쿼리의 WHERE절이나 JOIN 예약어를 사용했을때만 인덱스를 사용되며 SELECT 쿼리의 검색 속도를 빠르게 하는데 목적을 두고 있습니다.

※ DELETE,INSERT,UPDATE쿼리에는 해당 사항없으며 INDEX사용시 좀 느려집니다.

INDEX 를 사용해야 하는 경우

데이터 양이 많고 검색이 변경보다 빈번한 경우
인덱스를 걸고자 하는 필드의 값이 다양할 값을 가질 경우
(성별과 같이 데이터의 값의 종류가 일정한 경우 인덱스 효과 없음)

INDEX 사용시 조심할점

Index가 가해지는 필드는 가능한 Null값이 없어야 한다.
한 테이블에 5개 이상의 인덱스 적용은 권장하지 않는다.
(이화식 씨의 대용량 데이터베이스 설계 중에서)

인덱스를 사용한 필드를 조건에서 연산,가공하여 사용하면 인덱스효과는 없다.
ex : Select * from 테이블 where 인덱스필드 * 10 > 100
--> Select * from 테이블 where 인덱스필드  > 100 / 10 으로 사용

INDEX가 동작하지 않는 경우

다음 연산자는 인덱스를 타지 않는다.
not,<> 는 인덱스 사용못함(= >= <= 는 사용가능)
like '%value' 와 like '%value%'는 인덱스 사용못함(like 'like%'는 사용가능)
조건 컬럼을 가공하거나 연산을 하면 인덱스를 사용 못합니다.
문자열 타입에 인덱스를 걸경우 150 바이트 이하까지만 인덱스가 적용됩니다.

INDEX의 적용?

TABLE 생성과 동시에 해당 컬럼에 INDEX 주기

CREATE TABLE member (
idx int not null auto_increment primary key,
name varchar(10),
age varchar(10),

INDEX index1 (name),
INDEX index2 (age)
);

CREATE TABLE member (
idx int not null auto_increment primary key,
name varchar(10),
age varchar(10),

INDEX index1 (name,age)
);

설명:맨뒤에 INDEX index (name) 라고 주며 INDEX는 index생성을 말하며 index1(name)은 index명을 index1이라고 하며 사용자가 임의로 결정해 줍니다. name컬럼에 준다는 애기입니다.

ex)

레코드가 100개 있을때 explain select * from member where name='13'; 을 하면 rows가 1이 나온다.만약 index을 사용안하면 100이 나온다. 이는 검색을 위해 100개의 레코드를 검사했다는 애기입니다 rows가 1인것은 레코드를 1개 검사했다는 애기입니다.

TABLE이 생성되어있는경우 컬럼에 INDEX 삽입하기

alter table member add index index1(name);

TABLE이 생성되어있는 경우 INDEX 삭제하기

show keys from member1;
--본 쿼리로 인덱스명 확인

drop table member1 index drop key_name;
--인덱스명으로 index삭제(컬럼명 아님)

desc member1;
--key컬럼을 보고 MUL(index지정) 삭제되었나 확인

INDEX의 주의점?

1.인덱스가 해당 컬럼에 줄때는 반드시 not null이어야 한다.

INDEX의 사용(varchar)?

CREATE TABLE member1(
idx int not null auto_increment primary key,
name varchar(10),
age int,
INDEX index1 (name),
INDEX index2 (age)
);

insert into member1 (name,age) values ('11',11);
insert into member1 (name,age) values ('12',12);
insert into member1 (name,age) values ('13',13);
insert into member1 (name,age) values ('14',14);

CREATE TABLE member2(
idx int not null auto_increment primary key,
name varchar(10),
age int,
INDEX index1 (name,age)
);

insert into member2 (name,age) values ('11',11);
insert into member2 (name,age) values ('12',12);
insert into member2 (name,age) values ('13',13);
insert into member2 (name,age) values ('14',14);

CREATE TABLE member3(
idx int not null auto_increment primary key,
name varchar(10),
age int
);

insert into member3 (name,age) values ('11',11);
insert into member3 (name,age) values ('12',12);
insert into member3 (name,age) values ('13',13);
insert into member3 (name,age) values ('14',14);

explain select * from member1 where name ='13';
yes
explain select * from member2 where name ='13';
yes
explain select * from member3 where name ='13';
no

explain select * from member1 where age >10;
yes

explain select * from member2 where age >10;

no
explain select * from member3 where age >10;
no

설명 : 위와같이 age가 설정되면 index로 설정되면 age의 순서에 따라 정렬된 index를 가지기 때문에 레코드수의 증가와 거의 관계없이  query시간이 일정합니다. 그리고 당연히 order by age와 같이 정렬이 필요한 경우에도 따로 sort해줄 필요 없기 때문에 퀘리 시간이 짧아집니다.

explain select * from member1 where name ='13' and age =13;
yes
explain select * from member2 where name ='13' and age =13;
yes
explain select * from member3 where name ='13' and age =13;
no

explain select * from member1 where age =13;
yes
explain select * from member2 where age =13;
no

이유 : INDEX index1 (name,age)로 선언된 인덱스는 name,age의 값이 concate된 값이

index로 작용합니다.name이란 필드하나는 index의 역활을 하지 못합니다.
explain select * from member3 where age =13;
no

explain select * from member1 order by age;
no
explain select * from member2 order by age;
no
explain select * from member3 order by age;
no

explain select * from member1 where name='12' order by age;
yes
explain select * from member2 where name='12' order by age;
yes
explain select * from member3 where name='12' order by age;
no

explain select * from member1 where name like '12%' order by age;
yes
explain select * from member2 where name like '12%' order by age;
yes
explain select * from member3 where name like '12%' order by age;
no

explain select * from member1 where name like '%12' order by age;
explain select * from member1 where name like '%12%' order by age;
no
explain select * from member2 where name like '%12' order by age;
explain select * from member2 where name like '%12%' order by age;
no
explain select * from member3 where name like '%12' order by age;
explain select * from member3 where name like '%12%' order by age;
no

explain select * from member1 where  name like '12%' or age =12 order by age;
no
explain select * from member2 where  name like '12%' or age =12 order by age;
no
explain select * from member3 where  name like '12%' or age =12 order by age;
no

INDEX의 사용(int,char,date)?

create table member(
idx int auto_increment primary key,
name char(20),
age int,
day date,
index index1(name),
index index2(age),
index index3(day)
);

insert into member values(null,'junsik1',11,date_add(now(),interval 1 day));
에서 차례대로

insert into member values(null,'junsik8',18,date_add(now(),interval 8 day));
까지 입력한다.

explain select * from member where day between '2005-07-19' and '2005-07-23';
index를 타지만 풀스캔을 한다.

explain select * from member where day = '2005/07/17'
yes

explain select * from member where name in('junsik1','junsik2');
yes

explain select * from member where age in('12','13','14');
no

explain select * from member where age between 12 and 14;
yes

explain select * from member where age < 14;
yes

Posted by trigger
,

Source: http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/114644

import time
import threading

class Task( threading.Thread ):
    def __init__( self, action, loopdelay, initdelay ):
        self._action = action
        self._loopdelay = loopdelay
        self._initdelay = initdelay
        self._running = 1
        threading.Thread.__init__( self )

    def __repr__( self ):
        return '%s %s %s' % (
            self._action, self._loopdelay, self._initdelay )

    def run( self ):
        if self._initdelay:
            time.sleep( self._initdelay )
        self._runtime = time.time()
        while self._running:
            start = time.time()
            self._action()
            self._runtime += self._loopdelay
            time.sleep( self._runtime - start )

    def stop( self ):
        self._running = 0
   
class Scheduler:
    def __init__( self ):
        self._tasks = []
       
    def __repr__( self ):
        rep = ''
        for task in self._tasks:
            rep += '%s\n' % `task`
        return rep
       
    def AddTask( self, action, loopdelay, initdelay = 0 ):
        task = Task( action, loopdelay, initdelay )
        self._tasks.append( task )
   
    def StartAllTasks( self ):
        for task in self._tasks:
            task.start()
   
    def StopAllTasks( self ):
        for task in self._tasks:
            print 'Stopping task', task
            task.stop()
            task.join()
            print 'Stopped'

if __name__ == '__main__':

    def timestamp( s ):
        print '%.2f : %s' % ( time.time(), s )
   
    def Task1():
        timestamp( 'Task1' )

    def Task2():
        timestamp( '\tTask2' )

    def Task3():
        timestamp( '\t\tTask3' )
   
    s = Scheduler()

    #           task    loopdelay   initdelay
    # ---------------------------------------
    s.AddTask(  Task1,  1.0,        0       )
    s.AddTask(  Task2,  0.5,        0.25    )
    s.AddTask(  Task3,  0.1,        0.05    )

    print s
    s.StartAllTasks()
    raw_input()
    s.StopAllTasks()
Posted by trigger
,