리눅스에서 Apache2.2.4 + PHP 5.2.3 + mysql 5.1.19 설치

아파치와 PHP 소스 파일을 다운로드 받아 설치하는 방법을 설명한다. PHP 5.x에서 mysql을 사용하기 위해서는 반드시 컴파일 과정을 거쳐야 하므로 RPM을 이용한 설치에는 한계가 있다.

1. 준비사항

1-1. PHP 소스 파일 : http://www.php.net 에 접속하여 상단 메뉴 중 downloads를 클릭한다.(http://www.php.net/downloads.php 에 바로 접속할 수도 있다.)

PHP 5.2.3

Complete Source Code
PHP 5.2.3 (tar.gz) [9,123Kb] - 01 June 2007를 클릭하여 소스 코드를 다운로드 받는다.
미러링 사이트 중 Repoublic of Korea kr2.php.net HANBIRO에서 다운로드 하였다면, 다운로드 된 파일 이름은 php-5.2.3.tar.tar 이다.

1-2. 아파치 소스 파일 : http://httpd.apache.org/에 접속하여 Download! from a mirror를 클릭하면(http://httpd.apache.org/download.cgi 에 바로 접속할 수도 있다) 미러링 사이트로 KAIST가 자동 선택된다. 이곳에서 Unix Source: httpd-2.2.4.tar.gz를 클릭 하여 다운로드 받는다. 다운로드 된 파일 이름은 httpd-2.2.4.tar.gz 이다.

1-3. PHP 설치를 위한 XML 확장 설치

PHP 5부터 PHP에서 XML을 지원하기 위해 XML 확장을 설치해야 한다. 이에 따라 필요 라이브러리를 설치한다.
PHP5에서 XML 확장을 위해서 libxml2 와 libxslt 라이브러리를 설치해야 하는데, libxml2에서 zlib와 iconv 라이브러리를 필요로 하므로 이들 라이브러리의 설치가 선행되어야 한다.

1-3-1. zlib : 공식 사이트는 http://www.zlib.net 이다. 이곳에서 zlib source code, version 1.2.3, tar.gz format을 다운로드 받는다.
US(
www.zlib.net)에서 다운로드 받을 수 있으며 다른 미러링 사이트를 이용할 수도 있다. 다운로드된 파일 이름은 zlib-1.2.3.tar.tar 이다.

1-3-2. libconv : 에서 libconv를 다운로드 받을 수 있다. 이 문서는 업데이트가 늦은 관계로 The Latest release is biconv-1.11.tar.gz 로 되어 있지만, 이 링크를 클릭하여 다운로드 받으면 안된다. 앞서 받은 라이브러리의 버전이 최신 이므로 libiconv 역시 최신 버전은 1.9.1을 받아야 한다. 다운로드 받는 방법은 위에 표시되어 있는 libiconv-1.11.tar.gz 에서 파일 이름을 삭제 하면 디렉터리 리스트를 볼 수 있는데, 이곳에서 최신 버전의 소스를 다운로드 받는다. 즉 http://ftp.gnu.org/pub/gnu/libiconv/ 에 접속해서 libiconv-1.9.1.tar.gz를 다운로드 받는다.
다운로드 된 파일은 libiconv-1.9.2.tar.tar 이다.

1-3-3. libxml2 : 에서 libxml2 소스 최신 버전을 다운로드 받는다. 현재 최신 버전은 libxml2-2.6.29.tar.gz 이다. 다운로드 된 파일은 libxml2-2.6.29.tar.gz
1-3-4. libxslt : 에서 libxslt 소스 최신 버전을 다운로드 받는다. 현재 최신 버전은 libxslt-1.1.9.tar.gz 이다. 다운로드 된 파일은 libxslt-1.1.9.tar.gz 이다.

1-4. MySQL 설치 (MySQL은 5.0.37을 이용하였다)
http://www.mysql.com 에 접속하여 mysql 소스를 다운로드 받아 설치한다. mySQL은 두 가지 라이센스를 사용한다. 상업용으로 사용을 하기 위해서는 MySQL Enterprise를 구매해야 한다. 개발자용은 MySQL Community Server를 다운로드 받아 사용할 수 있다. http://www.mysql.com 에 접속하여 우측 사각형에서 MySQL Cmmunity Server Download를 클릭한다. 기본적으로 MySQL 5.0 Downloads에 접속하며, 여기에서 페이지 최 하단에 있는 Source downloads 항목에서 compressed GNU TAR archive(tar.gz)를 다운로드 받는다. 이 페이지에서 다운로드 받거나, 만일 다운로드에 성공하지 못하면 Pick a mirror를 선택하여 다른 다운로드 사이트에서 다운로드 받도록 한다. 다운로드 된 파일 이름은 mysql-5.1.19-beta.tar.gz 이다.

이렇게 해서 준비된 파일은 모두 다음과 같다.
php-5.2.3.tar.tar (
http://www.php.net/downloads.php)
httpd-2.2.4.tar.gz (
http://httpd.apache.org/download.cgi)
zlib-1.2.3.tar.tar (
http://www.zlib.net)
libiconv-1.9.2.tar.tar (
http://ftp.gnu.org/pub/gnu/libiconv/)
libxml2-2.6.29.tar.gz (
http://www.xmlsoft.org/sources/)
libxslt-1.1.9.tar.gz (
http://www.xmlsoft.org/sources/)
mysql-5.1.19-beta.tar.gz (
http://dev.mysql.com/downloads/mysql/5.0.html)


2. 설치

패키지의 설치이므로 root 권한으로 접속한다. 다운로드 패키지는 모두 /root/down/ 디렉터리에 존재하며, 설치는 /usr/local/ 에 설치하도록 한다.

2-1. 아파치 설치
2-1-1 아파치 압축 풀기

[root@ns down]# tar xvfz httpd-2.2.4

2-1-2 아파치 컴파일 및 설치

PHP를 아파치 2.2의 모듈로 다이나믹 로딩 하려면 아파치 서버가 DSO(Dynamic Shared Object)를 지원하도록 컴파일 해야 한다. 이를 위해 --enable-so 옵션을 사용하여 configure를 실행한다.

[root@ns down]# cd httpd-2.2.4
[root@ns httpd-2.2.4]# ./configure --enable-so

--prefix=[DIR] 옵션을 사용하여 원하는 위치에 설치할 수도 있으나, 앞서 전제 조건이 /usr/local/ 디렉토리에 설치하기로 했으므로 추가 옵션을 없어도 가능하다. 옵션 없이 설치 시 /usr/local/apache2 에 설치된다.

[root@ns httpd-2.2.4]# make
[root@ns httpd-2.2.4]# make install

설치가 완료 되었다. /usr/local/apache2 디렉터리로 이동하여 설치를 확인한다.

[root@ns httpd-2.2.4]# cd /usr/local/apache2/bin/
[root@ns bin]# ./apachectl start

※ 이미 아파치가 실행되고 있는 상태라면
[root@ns ~]#service httpd stop 으로 아파치의 구동을 종료한 후 실행한다.



2-2. zlib 설치
2-2-1 zlib 압축 해제
[root@ns down]# tar xvfz zlib-1.2.3.tar.tar

2-2-2 zlib 컴파일 및 설치
[root@ns down]# cd zlib-1.2.3
[root@ns zlib-1.2.3]# ./configure --prefix=/usr/local/

[root@ns zlib-1.2.3]# make
[root@ns zlib-1.2.3]# make install

2-3. libconv 설치
2-3-1 libiconv 압축 해제
[root@ns down]# tar xvfz libiconv-1.9.2.tar.tar

2-3-2 libiconv 컴파일 및 설치
[root@ns down]# cd libiconv-1.9.2
[root@ns libiconv-1.9.2]# ./configure --prefix=/usr/local/


[root@ns libiconv-1.9.2]# make
[root@ns libiconv-1.9.2]# make install


2-4. libxml2 설치
2-4-1 libxml2 압축 해제
[root@ns down]# tar xvfz libxml2-2.6.29.tar.gz

2-4-2 libxml2 컴파일 및 설치
[root@ns down]# cd libxml2-2.6.29
[root@ns llibxml2-2.6.29]# ./configure \
>--prefix=/usr/local/ \
>--with-zlib=/usr/local/ \
>--with-iconv=/usr/local/

[root@ns llibxml2-2.6.29]# make
[root@ns llibxml2-2.6.29]# make install


2-5. libxslt 설치
2-5-1 libxslt 압축 해제
[root@ns down]# tar xvfz libxslt-1.1.9.tar.gz

2-5-2 libxslt 컴파일 및 설치
[root@ns down]# cd libxslt-1.1.9
[root@ns libxslt-1.1.9]# ./configure --prefix=/usr/local/ \
> --with-libxml-prefix=/usr/local/ \
> --with-libxml-include-prefix=/usr/local/include/ \
> --with-libxml-libs-prefix=/usr/local/lib

[root@ns libxslt-1.1.9]# make
[root@ns libxslt-1.1.9]# make install

2-6. MySQL의 설치
MySQL을 설치하기 위하여 mysql group 의 생성 및 mysql 사용자 계정의 생성이 선행 되어야 하지만, 대부분의 경우 linux를 설치할 때 mysql을 설치하므로 이때 mysql 관련 그룹 및 계정이 생성된다. 이미 계정이 생성되어 있다면 새로 생성할 필요는 없다.
설치할 디렉터리는 /user/local/mysql 이므로 mysql 디렉터리를 미리 생성해 둔다.

[root@ns ~]# mkdir /usr/local/mysql
[root@ns ~]# groupadd mysql
[root@ns ~]# useradd -g mysql mysql


2-6-1 MySQL 압축 해제
[root@ns down]# tar xvfz mysql-5.1.19-beta.tar.gz
[root@ns down]# cd mysql-5.1.19-beta

2-6-2 MySQL 컴파일 및 설치
[root@ns mysql-5.1.19-beta]# ./configure --prefix=/usr/local/mysql/ \
>--with-mysqld-user=mysql \
>--without-debug

[root@ns mysql-5.1.19-beta]# make
[root@ns mysql-5.1.19-beta]# make install

설치가 끝나면, mysql_install_db를 실행하여 mysql 시스템 데이터 베이스와 test 데이터 베이스를 생성한다.
[root@ns mysql-5.1.19-beta]# cd /usr/local/mysql/bin
[root@ns bin]# ./mysql_install_db

/usr/local/mysql 디렉터리의 소유권을 root로 설정하고, MySQL data 디렉터리의 소유권을 mysql 사용자로 변경한다. 보안을 위해 설정하는 부분이다.
[root@ns ~]# chown -R root /usr/local/mysql
[root@ns ~]# chown -R mysql /usr/local/mysql/var
[root@ns ~]# chgrp -R mysql /usr/local/mysql

my.cnf 파일을 생성한다. MySQL 서버에서 환경 설정을 위한 파일이다.
[root@ns ~]#cp /usr/local/mysql/share/my-large.cnf /etc/my.cnf
※ 자신의 환경에 맞게 적당한 파일을 복사하면 된다.
[root@ns ~]# ls /usr/local/mysql/share/mysql/my*.cnf
/usr/local/mysql/share/mysql/my-huge.cnf
/usr/local/mysql/share/mysql/my-innodb-heavy-4G.cnf
/usr/local/mysql/share/mysql/my-large.cnf
/usr/local/mysql/share/mysql/my-medium.cnf
/usr/local/mysql/share/mysql/my-small.cnf


2-6-3 MySQL 서버의 구동 및 정지
[root@ns ~]# /usr/local/mysql/bin/mysqld_safe --user=mysql &

※ 이미 mysqld 데몬이 구동 중이면 우선 데몬을 중지 시킨다.
[root@ns ~]# service mysqld stop

mysql을 정지시키고자 한다면 다음 명령어를 입력한다.

[root@ns ~]# /usr/local/mysql/bin/mysqladmin shutdown

다시 시작하려면 위에서 설명한 대로 mysql_safe를 실행한다.

2-6-4 root 패스워드 변경 및 일반 사용자 계정 생성
이제 접속 하여서 root의 패스워드를 바꾸고 사용자 계정을 생성하도록 하자.
(이미 mysql이 설치되어 있다면 기존의 mysql 클라이언트를 이용해도 상관은 없다.)
[root@ns ~]#mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 115 to server version: 5.1.19-beta-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> use mysql
Database changed
mysql> select user, host, password
-> from user;
+------+-------------+-------------------- ------------------+
| user | host | password |
+------+--------------+----------------- -------------------+
| root | localhost | +
| root | ns.ifoxrose.com | |
| root | 127.0.0.1 | |
+------+-------------+----------------------------------------+
3 rows in set (0.00 sec)
mysql> update user
-> set password = password('**********')
-> where user = 'root';
Query OK, 3 rows affected (0.00 sec)
Rows matched: 3 Changed: 3 Warnings: 0
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> create database database_name;
Query OK, 1 row affected (0.00 sec)
mysql> grant all privileges on database_name to user_name identified by 'user_password';
Query OK, 0 rows affected (0.00 sec)
※일반적으로 mysql에서 데이터베이스 명과 계정명을 동일하게 준다.
mysql> exit
Bye


생성한 계정으로 접속을 시도해 본다.
[root@ns ~]# mysql -utest_user -p
Enter password:*********
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 116 to server version: 5.1.19-beta-log

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>


2-7. PHP의 설치
Share Apache 2.0 Handler module을 생성하기 위해 --with-apxs2[=FILE]을 사용한다. [FILE] 은 앞에서 설치한 Apache 디렉터리의 bin 디렉터리의 apxs파일을 이용한다. (--with-apxs2=/usr/local/apache2/bin/apxs)
또한 xml 확장 사용을 명시 하고(--with-xml) 앞서 설치한 libxml, xsl, dom, iconv 등의디렉터리를 설정하고, socket 프로그래밍에 사용할 수 있도록 --enable-sockets 옵션을 설정한다.
우리가 소스로 설치를 한 이유였던 데이터베이스 사용 설정을 추가해야 하는데, DBX를 사용하기 위한 옵션은 --enable-dbx 옵션이다. 물론 사용하고자 하는 데이터베이스에 대한 옵션을 넣어 주어야 하는데, mysql 의 경우 --with-mysql=[DIR] 이며, 오라클의 경우 --with-oracle=[DIR] 이다. mysql ext/mysqli 확장을 사용하고자 한다면 --with-mysqli 옵션을 추가한다. 이 과정을 순서대로 하면 다음과 같다.
2-7-1 libxslt 압축 해제
[root@ns down]# tar xvfz php-5.2.3.tar.tar

2-7-2 PHP 컴파일 및 설치

[root@ns down]# cd php-5.2.3
[root@ns php-5.2.3]#./configure --with-apxs2=/usr/local/apache2/bin/apxs \
>--with-zlib-dir=/usr/local/ \
>--with-xml \
>--with-libxml-dir=/usr/local/ \
>--with-xsl=/usr/local/ \
>--with-dom=/usr/local/ \
>--with-iconv \
>--enable-sockets \
>--enable-dbx \
>--with-mysql=/usr/local/mysql/ \
>--with-mysqli --with-oracle=/app/oracle/

※ 추가적인 설정을 보려면 ./configure --help를 이용한다.

[root@ns php-5.2.3]# make
[root@ns php-5.2.3]# make install

설치를 마치고 나면 Apacehe 와 PHP의 추가적인 설정이 필요 하다. 우선 php의 압축 해제 디렉터리에 있는 php.ini-dist 혹은 php.ini-recommended 파일 중 하나를 선택하여 php.ini 파일을 생성한다. php.ini-recommended 파일은 성능 향상을 낼 수 있도록 값이 조정되어 있는 파일이지만, 자신의 환경에 맞도록 설정해야 한다. 다음 예는 php.ini-dist 파일을 복사한 예이다. 물론 이미 잘 구동되고 있는 /etc/php.ini 파일을 복사해서 사용해도 된다.
[root@ns php-5.2.3]# ls php.ini*
php.ini-dist php.ini-recommended
[root@ns php-5.2.3]# cp php.ini-dist /usr/local/apache2/conf/php.ini

아파치를 구동해 보도록 하자
[root@ns bin]# /usr/local/apache2/bin/apachectl start
만일 일반 접속은 가능한데, 일반 사용자 접속이 불가능 하다면, /usr/local/apache2/conf/httpd.conf 파일에서 다음 내용을 검색해서 주석을 없애 준다.
# User home directories
# Include conf/extra/httpd-userdir.conf ; 주석을 없애서 다음과 같이 만든다.

# User home directories
Include conf/extra/httpd-userdir.conf


일반 사용자 계정의 html 문서가 정상적으로 동작 할 것이다. 이제 간단한 php 프로그램이 동작하는 지 살펴 보고 만일 동작하지 않는다면, httpd.conf 파일에 다음과 같이 AppType application/x-httpd-php .php .php4 .php5 등을 추가해 준다.

<IfModule mime_module>
#
# TypesConfig points to the file containing the list of mappings from
# filename extension to MIME-type.
#
TypesConfig conf/mime.types
…중략 …
AddType application/x-compress .Z
AddType application/x-gzip .gz .tgz
# 추가된 부분
AddType application/x-httpd-php .php .phtml .php3 .php5

'Linux' 카테고리의 다른 글

전체 세팅  (0) 2009.03.17
[리눅스] 아파치, mysql, php 소스 설치 절차  (0) 2009.03.17
tar  (0) 2008.07.25
명령어2  (0) 2008.07.25
명령어1  (0) 2008.07.25
Posted by 으랏차
,

개체-관계 모델

위키백과 ― 우리 모두의 백과사전.

데이터 모델링 분야에서 개체-관계 모델이란 구조화된 데이터에 대한 일련의 표현이다.

서로 관계된 두 개의 엔티티

"구조"화된 데이터를 저장하기 위해 데이터베이스를 쓴다. 이 데이터의 "구조" 및 그에 수반한 제약 조건들은 다양한 기법에 의해 설계될 수 있다. 그 기법 중 하나가 개체-관계 모델링(Entity-Relationship Modelling)이다. 줄여서 ERM이라고 한다. ERM 프로세스의 산출물을 가리켜 개체-관계 다이어그램(Entity-Relationship Diagram)이라 한다. 줄여서 ERD라 일컫는다. 데이터 모델링 과정은 데이터 모델을 그림으로 표현하기 위해 표시법을 필요로 한다. ERD는 개념적 데이터 모델 혹은 시맨틱 데이터 모델의 한 타입이다.

목차

[숨기기]

[편집] 사용처

정보 시스템을 디자인 해나가는 데에 위와 같은 모델들을 사용하여 시스템이 필요로 하는 정보를 기술한다든가 데이터베이스에 저장되어야 할 정보의 타입(type)이 무엇인가 분석해 나갈 수 있다. 특히 요구사항 단계에서 말이다.

어떤 도메인 오브 디스코스(관심 대상이 되는 부분)의 온톨로지를 기술할 때, 데이터 모델링 테크닉이 사용될 수 있다. (사용된 텀들(terms)과 그들과의 관계를 정의하고 분류하는 일이다.) 데이터베이스에 기반한 정보 시스템(information system)을 디자인하고자 하는 경우에는 나중에 가서는(논리 설계 단계) 개념 데이터 모델은 논리적 데이터 모델로 맵핑된다. 논리적 데이터 모델은 관계형 모델 같은 것이다; 뒤이어 논리적 데이터 모델은 물리 설계 단계에서 물리적 디자인 모델로 다시 맵핑된다. 단, 이와 같은 단계를 모두 뭉뚱그려 "물리 설계"라고 일컫기도 한다.

개체-관계 다이어그램(ERD)를 그리는 데에는 수많은 관습/방법(convention)이 존재한다. ERD를 그리는 데 아주 고전적인 방법이 이 문서의 아래에 기술되어 있다. 아래 기술된 방법은 개념 모델링과 주로 연관되어 있다.

데이터베이스 논리설계 및 물리설계 단계에서는 관습적으로 쓰이는 노테이션(notation)들이 몇 가지 더 있다. 예를 들면 인포메이션 엔지니어링, IDEF1X (ICAM DEFinition Language), 디멘저널 모델링 같은 것들이다.

[편집] 전통적인 다이어그램 컨벤션

서로 관계된 두 개의 엔티티
애트리뷰트를 갖는 엔티티
애트리뷰트를 갖는 관계
ER 다이어그램 예제

개체(엔티티)는 분리된 물체 하나를 표현한다. 엔티티는 명사 하나에 해당한다고 생각하면 쉽다. 예를 들면 다음과 같다: 컴퓨터(1개), 사람(1명), 악곡(1개), 수학적 정리(1개). 엔티티는 사각형으로 표시된다.

관계(릴레이션쉽)는 두 개 이상의 엔티티들이 어떻게 서로 연관되어 있나를 기록한다. 예를 들면 다음과 같다: 회사와 컴퓨터 사이의 "소유하다"라는 관계, 상사와 부하 직원 사이의 "감독하다"라는 관계, 연주자와 악곡 사이의 "연주"라는 관계, 수학자와 수학 정리 사이의 "증명했다"라는 관계 등이다. 관계는 다이아몬드형으로 그리는데, 관계된 엔티티와는 실선으로 연결한다.


엔티티도 애트리뷰트를 가질 수 있고, 관계로 애트리뷰트를 가질 수 있다. 예를들면 다음과 같다: 피고용인 엔티티는 생년월일 애트리뷰트를 가질 수 있다; "증명됐다" 관계는 "날짜" 애트리뷰트를 가질 수 있다. 애트리뷰트는 엔티티 집합이나 관계 집합에 선으로 연결시킨 타원형들로 그린다.

모든 엔티티(위크 엔티티가 아닌 한)는 "고유하게 식별되는" 애트리뷰트 집합을 가지고 있어야 한다. 최소한의 고유 식별 애트리뷰트 집합은 엔티티의 기본 키(Primary Key)라 불린다.

개체-관계 다이어그램은 하나의(single) 엔티티를 보여주고 있거나 하나의(single) 관계 인스턴스를 보여주고 있는 것은 아니다. 사각형은 "엔티티 집합들"을 나타내고 있는 것이고, 다이아몬드형은 "관계 집합들"을 보여주고 있는 것이다. 예를 들면 다음과 같다: 특정한 악곡은 하나의 엔티티이다. 하나의 데이터베이스 안의 모든 악곡들의 모음은 하나의 엔티티 집합이다. 한 아이와 그 아이의 점심 도시락 사이의 "먹어치움" 관계는 하나의(single) 관계이다. 하나의 데이터베이스 안의 모든 그러한 아이-점시 도시락 관계는 관계 집합이다.

실선은 관련된 엔티티 집합과 관계 집합 사이에 그린다. 엔티티 집합의 모든 엔티티가 관계에 참여(participate)하고 있을 때, 선을 굴게(thick) 그리거나 이중선(double) 으로 그린다. 이것을 파티시페이션 콘스트레인트라고 부른다. 엔티티 집합 내의 각각의 엔티티가 관계 집합 내의 최대 한 개의 관계에 참여할 수 있을 때, 엔티티 집합에서 관계 집합 쪽으로 화살표를 하나 그려준다. 이것을 키 콘스트레인트라고 부른다. 엔티티 집합 내의 모든 엔티티가 각각 하나씩의 관계에 정확히 대응될 때는 화살표를 굵게(thick) 그린다.

다대다(many-to-many) 관계를 기술할 때는 어소시에이티브 엔티티를 사용할 수 있다. [1].

단일 테이블의 행 사이의 관계를 기술하기 위해 단방향 관계(Unary Relationships)를 사용할 수도 있다.

[편집] 때때로 쓰이는 기호

ER 모델링에서 어떤 기호들은 그렇게 자주 사용되지 않는다. 모델러들은 이러한 기호들을 종종 기피한다.

엔티티는 "스트롱(strong)" 엔티티일 수도 있고 "위크(weak)" 엔티티일 수도 있다.

  • 상기 단락에서 기술한 보통의 엔티티를 가리켜 "스트롱 엔티티"라고 한다. 스트롱 엔티티는 엔티티가 가진 애트리뷰트들만 가지고 고유하게 정의될 수 있다.
  • "위크 엔티티"는 엔티티가 가진 애트리뷰트들만 가지고 고유하게 정의될 수 없는 엔티티를 말한다. 따라서 한 개 이상의 관계를 엔티티의 프라이머리 키로 삼아야 한다. 위크 엔티티는 엔티티를 나타내는 사각형을 그리고, 관계를 나타내는 다이아몬드형을 그린 뒤, 그 둘을 굵은(bold) 선이나 이중(double)선으로 연결하여 표현한다. 예를 들면, 업무 추적(work tracking) 데이터베이스에서는, 한 태스크(task)는 태스크를 할당받은 사람(person)을 이용하여 식별된다. 이 때 사람(person)은 엔티티이고, 태스크(task)는 위크 엔티티가 된다.

ER 모델링에서 애트리뷰트들은 다치(multi-valued) 애트리뷰트일 수도, 합성(composite) 애트리뷰트일 수도 혹은 종속(derived) 애트리뷰트일 수 도 있다:

  • "다치 애트리뷰트"(multi-valued attribute)는 이중선(double line)으로 둘러싸인 타원으로표현된다. 적어도 한 개체의 인스턴스에 대해서 한 개 이상의 값을 가질 수 있는 애트리뷰트이다. 예를 들어, 소프트웨어(엔티티는 "애플리켜이션")는 다치값의 "플랫폼" 애트리뷰트를 가질 수 있다. 애플리케이션의 인스턴스는 한 개 이상의 플랫폼 상에서 동작할 수 있기도 하기 때문이다.
  • "합성 애트리뷰트"(composite attribute)는 두 개 이상의 애트리뷰트를 포함할 수 있는 애트리뷰트를 말한다. 자기 자신도 포함할 수도 있다. 예를 들면 주소는 번지, 도시 등등의 애트리뷰트들로 이루어진 합성 애트리뷰트라 할 수 있다.
  • "추출 애트리뷰트"(derived attribute)는 그 값이 데이터베이스의 다른 정보에 의해 결정되는 애트리뷰트를 말한다; 종속 애트리뷰트는 점선으로 그린 타원형으로 표시한다. 예를 들면, 피고용인 데이터베이스가 있다고 가정할 때, "피고용인"의 "나이" 애트리뷰트는, "피고용인"의 "생년월일" 애트리뷰트로부터 추출/유도(derive)해낼 수 있다.

때때로 어떤 두 엔티티가 더 일반적인 분류의 엔티티의 하위 분류일 경우가 있을 수 있다. 예를 들면, 소프트웨어 기업의 피고용인 엔티티는 프로그래머 엔티티일 수 있고 마케터 엔티티일 수 있다. 위와 같은 경우, ISA라는 말을 안에 써 넣은 삼각형으로 표시한다. 수퍼클래스는 위쪽에 그리고 다른 두 개(혹은 그 이상)의 서브클래스들은 밑변쪽(아래쪽)에 그린다.

어떤 한 개의 관계와 그것과 엮인 엔티티 집합들은 다시 단일 엔티티 집합으로 간주될 수있다. 이것을 어그리게이션이라 하는데, 다른 관계와 엮을려는 목적이다. 어그리게이션은 어그리게이트된 모든 개체와 관계를 둘러싼 점선 사각형으로 표시된다.

[편집] 다른 다이어그램 컨벤션

[편집] 크로우즈 핏 (까마귀 발)

크로우즈 핏 노테이션을 사용해 나타낸 두엔티티

크로우즈 풋/크로우즈 핏(Crow's Foot) 노테이션에서는, 엔티티 사이의 관계를 기본적으로 엔티티를 연결하는 선으로 나타낸다. 또한 관계의 카디널리티를 나타내는 기호들을 그 선의 양끝에 표시한다.

카디널리티를 나타내는 기호들은 다음과 같은 것들이 있다:

  • "고리"(ring)은 "0"를 나타낸다.
  • "사선"(dash)은 "1"을 나타낸다.
  • "까마귀 발"(crow's foot)은 "다수" 혹은 "그 이상"을 나타낸다.

위와 같은 기호들은 서로 조합되서 사용될 수 있다. 다음과 같은 네 가지 조합이 가능하다.

  • 고리와 사선 → 0 혹은 1
  • 사선과 사선 → 정확히 1
  • 고리와 까마귀 발 → 0개 이상
  • 사선과 까마귀 팔 → 1개 이상

크로우즈 핏(crow's feet) 노테이션의 예제는 오른쪽 그림을 참조하라.

오른쪽 그림에서, 우리는 다음과 같은 사실을 알 수 있다:

  • 음악가(Artist)는 "0개 혹은 그 이상의" 노래(song)를 부른다.
  • 노래 한 곡은 정확히 한 음악가(artist)에 의해 불러진다. (주의: 실제 세계를 잘 반영하지못하는 예제이다. 노래 한 곡을 듀엣으로 부를 수도 있는 것이다.)

크로우즈 핏 노테이션은 오라클 데이터베이스 텍스트에서 널리 쓰이고 있다. 또한 마이크로소프트 비지오, 파워디자이너, 다이어 (소프트웨어) 등의 틀에서 쓰이고 있다.

[편집] 장점

  • 크로우즈 핏 노테이션을 사용하면 다수(many) 관계를 표현하는 것이 명확해 진다.
  • 필수적인 관계가 있다면, 크루오즈 핏 노테이션은 그것을 표현하기 위한 간결한 노테이션이 된다. 이 때는 수직선만 표시하면 된다. 또한 옵셔널한 관계가 있다면, 그것을 표현하기 위한 간결한 노테이션이 되는데, 이 때에는 고리(open circle)로 표시하면 된다.

[편집] 같이 보기

[편집] 상용 ER 다이어그램 작성 툴

[편집] 자유 소프트웨어 ER 다이어그램 작성 툴

  • DBDesigner: ERM을 채택한 MySQL 데이터베이스 설계자를 위한 툴.
  • DBDesigner-Fork: DBDesigner의 변종. PostgreSQL과 같은 다른 데이터베이스 시스템도 이용할 수 있게 변형됨.
  • 다이어 (소프트웨어): ERD 외에도 다른 여러 다이그램을 작성할 수 있는 툴.
  • 페렛 (소프트웨어): 데비안, 우분투와 같이 배포되는 ERM 툴.
  • 카이비오: (Kivio) ER 다이어그램도 지원하는 순서도 그리기 툴.
  • MySQL 웍벤치: (MySQL WorkBench) 그래픽하게 스키마와 리버스 엔지니어링 스키마들을 작성할 수 있다. 여러 데이터베이스 엔진을 타겟으로 한다.
  • 오픈 시스템 아키텍트: (Open System Architect) ER 다이어그램 모델러. 가장 최근 버전은 2005년에 나온 것이다.
  • 파워*아키텍트: (POWER*ARCHITECT) 자바 언어로 작성된 ER 다이어그램 모델러. 여러 자유 소프트웨어 및 상용 데이터베이스 엔진을 타겟으로 함.

[편집] 주석

피터 첸이 지은 이 논문은 컴퓨터 과학 분야에서 가장 많이 인용되는 논문이다. 1000여 명의 컴퓨터 과학과 교수 설문 결과 "가장 영향력 있는" 논문으로 꼽혔다. 인용 논문의 목록은 DBLP: http://dblp.uni-trier.de/ [2] 등지에서 볼 수 있다.

Posted by 으랏차
,

JOIN

sql 2009. 1. 8. 13:54

조인(JOIN)

 

 

조인(JOIN)

 : 두 개 이상의 테이블을 서로 묶어서 하나의 결과 집합으로 만들어 내는 것

 

 

INNER JOIN (내부 조인)

  - 가장 많이 사용되는 조인

  - 일반적으로 JOIN이라 하면 INNER JOIN을 뜻함

 

 구문형식

 

  SELECT <열 목록>

  FROM <첫번째 테이블>

        INNER JOIN <두번째 테이블>

        ON <조인될 조건>

  [WHERE 검색조건]

 

 ex> database1 의 테이블 table1과 table2를 id를 일치시켜 INNER JOIN

 

  USE testDB

  SELECT A.id, A.name, B.ename

  FROM table1 A

        INNER JOIN table2 B

        ON A.id = B.id

  WHERE A.id = '007'

 

 

 

OUTER JOIN (외부 조인)

  - 조인의 조건에 맞지 않는 행까지도 포함

  - LEFT OUTER JOIN : 왼쪽 테이블의 것은 모두 출력되어야 함

  - RIGHT OUTER JOIN : 오른쪽 테이블의 것은 모두 출력되어야 함

  - FULL OUTER JOIN : 양쪽 모두에 조건이 일치하지 않는 것을 모두 출력하는 개념

 

 구문 형식 

 

  SELECT <열목록>

  FROM <첫번째 테이블(Left 테이블)>

         <LEFT | RIGHT | FULL> OUTER JOIN <두번째 테이블(RIGHT 테이블)>

         ON <조인될 조건>

  [WHERE 검색조건]

 

 ex>

 

  USE testDB

  SELECT A.stdname, A.addr, B.etcname, B.stdid

  FROM table1 A

         LEFT OUTER JOIN table3 C

              ON B.stdname = C.stdname

         RIGHT OUTER JOIN table2 B

              ON C.etcname = B. etcname

  ORDER BY B.etcname

 

 

 

CROSS JOIN (상호 조인)

  - 한쪽 테이블의 모든 행들과 다른 쪽 테이블의 모든 행을 조인

  - 결과의 개수는 두 테이블 개수를 곱한 개수가 됨 (카티션 곱: Cartesian Product)

 

 ex> CROSS JOIN의 데이터 개수 출력

 

  USE AdventureWorks

  SELECT COUNT_BIG(*) AS [데이터개수]

  FROM Sales.SalesOrderDetail A

      CROSS JOIN Sales.SalesOrderHeader B

 

 

 

SELF JOIN (자체 조인)

  - 별도의 구문이 있는 것이 아니라, 자기 자신과 조인한다는 의미

 

 ex>

 

  USE testDB

  SELECT A.name, B.name, B.detail

  FROM testTbl A

        INNER JOIN testTbl B

        ON A.etcname = B.name

  WHERE A.name = 'Lee'

 

 

 

UNION, UNION ALL

  - 두 쿼리의 결과를 행으로 합치는 것

 

 ex>

 

  USE testDB

  SELECT stdName, Addr FROM stdTbl

  UNION ALL

  SELECT etcName, Room FROM roomTbl

 

 

'sql' 카테고리의 다른 글

DB Design시 고려해야 할 제약성(Constraint) 정의  (0) 2009.01.07
Mysql Account 생성  (0) 2009.01.07
root 사용자 password 바꾸기  (0) 2009.01.07
mysql 한글지원설정  (0) 2009.01.07
mysql 동시접속자수  (0) 2009.01.07
Posted by 으랏차
,

종합실습예제
:간단한 쇼핑몰 DB설계 및 DB에 데이터를 입출력하는 웹페이지 제작

 

 

1) 데이터베이스 생성 및 MySQL사용자 생성/권한 부여


- DB이름: shopDB

  USE mysql;
  CREATE DATABASE shopDB;

 


2) MySQL 사용자: shopuser
 

- 암호: shop1234

  USE shopDB;
  GRANT ALL ON shopDB.* TO
shopuser@localhost identified by ‘shop1234’ ;
  flush privileges;

 


3) 테이블 디자인 및 생성
 

- 회원 테이블 구성
    테이블이름: member

Field

Type

Null

Constraint

Extra

Description 

   m_id

   int

   NO

  PRIMARY KEY

 auto_increment

  회원ID

   nick

   char(10)

   NO

  UNIQUE

 -

  별명

   addr

   char(20)

   YES

  -

 -

  주소

   phone

   char(11)

   NO

  -

 -

  전화번호

   job

   char(15)

   YES

  -

 -

  직업

   point

   int

   YES

  -

 -

  적립포인트

   email

   varchar(30)

   NO

  UNIQUE

 -

  이메일주소


 

   USE shopDB;
  CREATE TABLE member

  (     m_id INT PRIMARY KEY AUTO_INCREMENT,

        nick CHAR(10) UNIQUE NOT NULL,

        addr CHAR(20),

        phone CHAR(11) NOT NULL,

        job CHAR(15),

        point INT,

        email VARCHAR(30) NOT NULL UNIQUE );

 

 

 

- 카테고리 테이블 구성

    테이블 이름 : category

  Field    Type    Null  Constraint  Extra  Description 
  cat_id     int    NO  PRIMARY KEY  auto_increment   카테고리번호
  cat_name    varchar(20)    NO  UNIQUE  -   카테고리이름
  cat_desc    varchar(40)    YES    -   카테고리설명

 

 

  USE shopDB ;

  CREATE TABLE category

  ( cat_id INT PRIMARY KEY AUTO_INCREMENT,

    cat_name VARCHAR(20) UNIQUE NOT NULL,

    cat_desc VARCHAR(40) );

 


 

- 제품 테이블 구성

    테이블 이름 : product

  Field   Type   Null  Constraint   Extra  Description 
  p_id   int   NO  PRIMARY KEY  auto_increment  제품ID
  cat_id   int   YES

 FOREIGN KEY

 :category(cat_id)

 -  카테고리ID
  descript   varchar(100)   YES  -  -  제품설명
  price   int   NO  -  -  가격
  p_num   int   NO  -  -  재고수량

 

 

  USE shopDB;

  CREATE TABLE product

  ( p_id INT PRIMARY KEY AUTO_INCREMENT,

    cat_id INT REFERENCES category(cat_id),

    descript VARCHAR(100),

    price INT NOT NULL,

    p_num INT NOT NULL);

 

 

 

- 구매 테이블 구성

    테이블 이름 : buyTable

  Field   Type     Null   Constraint   Extra  Description 
  b_id   int   NO  PRIMARY KEY  auto_increment   주문번호
  p_id   int   NO

 FOREIGN KEY

 : product(p_id)

 -   제품ID
  m_id   int   NO

 FOREIGN KEY

 : member(m_id)

 -   회원ID
  b_num   int   NO  -  -   주문수량
  b_date   datetime   NO  -  -   주문일시

 

 

  USE shopDB;

  CREATE TABLE buyTable

  ( b_id INT PRIMARY KEY AUTO_INCREMENT,

    p_id INT REFERENCES product(p_id),

    m_id INT REFERENCES member(m_id),

    b_num INT NOT NULL,

    b_date DATETIME NOT NULL );

 

 

 

4) 신규 카테고리 항목 입력  웹페이지 작성


vi /usr/local/apache/htdocs/cat_insert.html

 

  <html>

  <head> <title>카테고리 항목 입력</title> </head>

  <body> <form action="cat_insert.php" method="POST">

  <p>카테고리 이름:<br>

  <input type="text" name="cat_name" size="30">

  <p>카테고리 설명:<br>

  <input type="text" name="cat_desc" size="30">

  <p><input type="submit" name="submit" value="입력"></p>

  </form> </body>

  </html>

 

 

 

vi /usr/local/apache/htdocs/cat_insert.php

 

  <?php

  $mysqli = mysqli_connect("localhost","shop_user","shop1234","shopDB");

  if (mysqli_connect_errno()) {

             printf("Connect failed: %s\n",mysqli_connect_error());

             exit();

  }

  else {

            $sql = "insert into category (cat_name,cat_desc)

            values ('".$_POST["cat_name"]."','".$_POST["cat_desc"]."')" ;

            $res = mysqli_query($mysqli,$sql);

            if ($res === TRUE) {

                          echo "A record has been inserted.";

            }

            else {

                          printf("Could not insert record: %s\n",mysqli_error($mysqli));

            }

  mysqli_close($mysqli);

  }

  ?>

 

 

 

5) 입력된 레코드 출력 php파일 작성


vi /usr/local/apache/htdocs/cat_fetch.php

 

  <?php

  $mysqli = mysqli_connect("localhost","shop_user","shop1234","shopDB");

  if (mysqli_connect_errno()) {

             printf("Connect failed: %s\n",mysqli_connect_error());

             exit();

  }

  else {

             $sql = "select * from category";

             $res = mysqli_query($mysqli,$sql);

             if ($res) {

                           while ($newArray = mysqli_fetch_array($res,MYSQLI_ASSOC)) {

                                        $cat_name = $newArray['cat_name'];

                                        $cat_desc= $newArray['cat_desc'];

                                        echo "The ID is ".$cat_name." and the text is ".$cat_desc."<br/>";

                                        }

             }

            else {

                           printf("Could not retrieve records: %s\n",mysqli_error($mysqli));

             }

             mysqli_free_result($res);

             mysqli_close($mysqli);

  }

  ?>

 


 





 

 

Posted by 으랏차
,

<출처: 엔코아 - 열린기술광장>

PURPOSE

RDBMS의 물리적인 데이터베이스 설계시 필요한 각종 제약성 정의 (Integrity Constraints)에 대하여 정확한 의미를 전달하고자 한다.

SCOPE & APPLICATION

RDBMS 에서는 서로 독립적이면서 데이터의 중복을 최소화하면서도 필요시 언제든지 서로 관계 연산자를 위용하여 정보의 연결을 가능하게 하여 새로운 정보를 창출하게 하는 위력을 가지고 있다. 또한 DB설계시 정의된 설계 사상에 대하여 DBMS Level에서 사전 정의를 할 수 있으며 이로 인하여 데이터의 일관성 및 일치성 그리고 무결성을 응용 프로그램의 추가 부담이 없이 보장 받을 수 있다.

그러나, 실제 고객사의 상황을 접하면 성능 또는 User Interface 불편 등을 이유로 하여 제대로 DBMS의 효율적인 기능을 활용하지 못하고 비정상적인 데이터들이 누적되고 있는 상황을 많이 접하게 된다.

여기서는 RDBMS를 이용한 DB설계시 고려할 수 있는 각종 Constraint에 대한 현실 활용 이해를 높이고 상황에 다른 명확한 적용지침을 기술토록 한다.

KEY IDEA

(KEY WORD : Referential, Constraint, Integrity, 무결성, 제약, 참조, DB Design)

SUPPOSITION

DESCRIPTION

  • RDBMS 에서 언급하는 대표적인 사전 제약정의 (Pre-Define Constraints)는 참조 무결성(Referential Integrity) , 속성 무결성(Attribute Integrity) , 엔터티 무결성(Entity Integrity) 그리고 사용자정의 무결성(User Defined Integrity)과 같이 대표적인 네가지 무결성 정의를 사용할 수 있다.
  • 그럼, 다음 [그림1]의 사례 Instance를 이용하여 대표적인 네가지 형태의 무결성 정의에 대하여 각각 상세히 살펴보자

                      

[그림 1]

  • 엔터티 무결성(Entity Integrity)

기본키(Primary Key)를 구성하는 모든 속성은 반드시 값을 가져야 한다. (not null)

√기본키(Primary Key)는 유일성을 보장해 주는 최소한의 집합이어야 한다. (minimal set of attributes)

√상기 제약 정의의 대표적인 Constraints는 PRIMARY KEY, UNIQUE, NOT NULL constraints가 해당 된다.

√즉, 엔터티 무결성이란 엔터티의 자격 검증을 할 수 있는지를 엄밀히 검토해 보면 명확해 진다. 실제 현실에서는 PK도 존재하지 않는 테이블을 사용하고 있는 경우도 다반사라는 것을 여러분 중에서도 경험자가 많을 것이다.

√ 하나의 엔터티가 물리적인 테이블로서 존재의 의미를 부여받기 위해서는 반드시 그 테이블에 존재하는 수많은 Row(Tuple) 중에서 유일한 Row(Tuple)를 인식할 수 있는 식별자가 있어야 된다는 것은 이미 데이터 모델링 단계의 엔터티 자격 검증에서 이루어졌을 것이며 이러한 엔터티 자격의 원칙이 물리적인 DB Design단계에서는 바로 PK 정의가 된다.

√고로, 식별자가 되기 위해서는 절대 모르는 값(Null)이 식별자가 될 수 없음은 당연한 이치이며,

√데이터 모델링 단계에서는 엔터티가 태어나기 위한 부모가 명확하게 정의되어 의미상의 주어가 식별자가 되었다면 물리적인 측면을 고려하여 최소한의 식별자를 구성하기 위한 속성 검토 역시 설계자가 노력하여야 되는 것도 당연한 이치이다.

√ 만일 A라는 엔터티의 식별자(UID)가 고객코드+상품코드+계약순번 으로 구성된다고 가정해 보자. 그리고 이러한 A라는 엔터티는 업무적으로 자료발생의 중심이 되는 메인 엔터티라면 또다시 수 많은 자식 엔터티를 탄생하게 되어 손자, 증손자 등의 후손 엔터티를 갖게 될 경우에는 직접종속 속성으로 PK를 상속받아 구성할 경우에는 손자, 증손자 대 에서는 PK구성 속성은 엄청나게 많은 속성들이 복합구성으로 필요로 하게될 것이다.

√ 이러한 문제를 미연에 예방하기 위해서 인공식별자(얼굴마담,Artificial UID)를 데이터 모델링 단계에서 고려할 수 있으며, 데이터 모델링 단계에서 지정하지 못할 경우에는 물리적인 DB Design 단계에서 최소의 속성 모임으로 PK를 지정하게 하는 것이다. 이것이 바로 Minimal Set Of Attributes 정의이다.

√유일한 식별자 지정은 테이블의 수많은 컬럼을 조합시킨다면 당연히 PK 자격이 될 수 있으나, 진정으로 임의의 Row를 인식시킬 수 있는 최소한 컬럼으로 정의하여야 된다는 의미이다.

√상기 [그림1] 예제에서 엔터티 무결성을 정의한 DEPT Table을 위한 DDL Script는 다음과 같다.

Create Table DEPT
(deptno number
not null primary key,
dname varchar(20),
loc varchar(20))

  • 참조무결성 (Referential Integrity)

외부키(Foreign Key)는 반드시 존재하고 있는 기본키(Primary Key)와 연결되거나 NULL 이어야 한다

√상기 제약 정의의 대표적인 Constraints는 Reference constraint 가 해당 된다.

√즉, RDBMS는 모든 엔터티들이 관계(Relation)를 가지고 설계되어 서로 독립적인 정보들만으로 데이터의 중복을 억제할 수 있는 기본 사상이 바로 관계(Relation)이다.

√임의의 엔터티는 관계(Relation)를 통하여 정의되어 있을 경우에는 해당 관계의 1쪽(부모:참조되는쪽) 식별자 속성이 관계 명칭으로 M쪽(자식:참조하는쪽) 물리적인 테이블에 속성(컬럼)으로 생성되게 된다.

√이렇게 관계에 의하여 생성된 컬럼은 반드시 부모가 존재해야 만이 생성될 자격이 있으며 이러한 원리를 정의하는 DBMS Constraint가 바로 Referential Constraint이다.

√고로, 관계가 아직 정해지지 않고 Row(Tuple)가 생성된 경우 즉, 아직 관계를 모르는 경우에는 값이 Null이어야 하며 관계가 생성될 경우에는 반드시 존재하는 부모의 식별자가 컬럼 값으로 사용되어야 한다.

√ 이렇게 RI(Referential Integrity) 정의가 되어 있는 상황에서는 부모(참조되는쪽) 테이블의 임의의 Row (tuple)를 삭제할 경우에는 자식(참조하는쪽)들에서 RI가 지정되어 있다면 함부로 자식이 있는 부모가 사라질 수 없도록 DBMS는 자료의 참조 무결성을 보장하기 위하여 체크 및 검증을 내부적으로 보장하게 한다.

√이러한 RI 정의가 명확하게 되어 있을 경우에는 부모가 없는 자식 정보가 태어나거나, 자식이 있음에도 불구하고 부모의 정보가 사라지게 되는 참조무결성 위험요소를 극복할 수 있다.

√ 그러나, 현실 Project에서는 이 뛰어난 DBMS능력을 배제하고자 한다. 이유는 초기단계에서의 Data Migration 및 개발 프로그램 테스트시에 정확한 Data의 관계를 체크하여 줌으로 인하여 오히려 짜증을 내게 되며 다량의 초기 정보 구축시에는 부모 정보의 정확한 구축이 되어야 자식정보 구축이 가능하기 때문에 시간이 부족한 상황에서 병렬로 진행하고자 이를 모두 무시하고(Disabled) 개발을 진행하게 된다.

√이러한 상황은 충분히 이해를 할 수 있으나, 이러한 무방비책을 운영환경까지 고수하는 것은 안될 말이다. 즉, Migration시 쓰는 기법은 그 단계에서만 효율적이라는 예기이다.

√ 그동안의 IT 시스템의 주 관심은 자료의 축적 그리고 업무처리에 중심을 둔 시스템 구축이었으나 최근의 환경은 유행처럼 번지고 있는 DataWare House , DB Marketing이다. 이러한 DW의 성공 여부는 바로 정확한 정보의 숙성된 축적정보가 핵심이며 이를 위해서 DW 프로젝트에서 얼마나 많은 노고를 ETT에 쏟아야만 하는가 ? 또 그 엄청난 노력에도 불구하고 얻는 효과가 미흡하다는 결론이 당연시 되는 이유는 바로 기본에 충실하지 못했던 과거의 업보가 아닌가 ?

√ 혹자는 RI, PK 등 각종 Constraints 들로 인하여 성능상 문제가 있어 어쩔 수 없이 모두 해제하여 사용하고 있다고 한다. 진정 그런가 ? 아니다 ! DBMS Internal Processing에 의하여 보장되는 이러한 기능은 성능상 문제를 일으킬 만한 어리석은 DBMS는 아마 사장되었을 것이다. 성능의 문제는 바로 다른 곳에 있다. 이러한 잘못된 판단기준은 대부분 대량의 초기 데이터 구축시 체험한 감으로 잘못된 기준을 스스로 만들고 있는 것이다.

√ 대량의 데이터를 생성할 초기 Migration 시점이나 대량의 Batch작업시에는 해당 Constraints를 Disable시킨 상황에서 작업하는 것이 정답이며 작업 후 최단시간에(Parallel등의 기법 이용) Enable시키는 것이 정답이다. 단, 대량 데이터 처리시에 각종 제약사항을 모두 만족시키도록 데이터 생성 원칙을 준수한 프로그램이 되어야 할 것이다. 그외의 Online TXN 및 업무적인 데이터 처리에서의 성능상 문제는 결코 지대하지 않다는 것을 알아야 한다.

√ 이러한 Constraint 지정을 잠시 묵인토록 하는 Disable기법이나, 관계를 무시한 데이터의 삭제 및 수정작업을 위한 DDL Script는 DBMS마다 사용하는 방법에 약간의 차이가 있다. 하지만 어느 RDBMS에서나 이러한 작업을 위한 기법은 다 사용이 가능하니, 해당 DBMS Vendor에서 제공되는 SQL Reference Manual을 참고하기 바란다. (예:Oracle Cascade option : SQL Reference Manual , Create table, Alter table, constraint clause)

√상기 [그림1] 예제에서 참조적 무결성을 정의한 DEPT와 EMP Table을 위한 DDL Script는 다음과 같다.

Create Table DEPT
(deptno number
not null primary key,
dname varchar(20),
loc varchar(20))

Create Table PROJ
(projno number
not null primary key,
projname varchar(20),
stdt date,
enddt date)

Create Table EMP
(empno number
not null primary key,
ename varchar(20),
deptno number
references dept,
projno number
references proj)

  • 속성무결성 (Attribute Integrity)

컬럼은 지정된 데이타 형식(format,type,size)을 만족하는 값만 포함해야 한다.

√ 상기 제약 정의의 대표적인 Constraints는 DDL Script에 사용되는 Data Type (size)들이며, 예를들면 숫자를 위한 NUMBER, 고정길이 Alpha-Numeric을 위한 CHAR, 가변길이 Alpha-Numeric을 위한 VARCHAR 등, DATE, LONG, LONG RAW 등등 DBMS제품마다 약간의 차이는 있지만 대부분 범용적으로 사용되는 Data type은 어는 DBMS나 거의 유사하다.

√임의의 테이블에는 하나 이상의 여러 속성들이 정의되게 되며 이러한 속성들은 물리적인 테이블의 컬럼들로 정의되게 되며 이렇게 하나의 컬럼이 지정될 경우에는 Datatype 및 Format이 지정되어야 한다.

√ 예로, 사원번호라는 컬럼이 number data type으로 정의될 경우에는 반드시 숫자 값만이 사원번호에 들어올 자격이 있으며 만일 사원번호 컬럼을 number(4) 로 지정할 경우에는 숫자 값 중에서 4자리수 이내의 값만이 들어올 자격이 있다는 의미이다.

√어떻게 보면 이러한 속성 무결성을 위한 고려는 매우 쉽게 생각하거나 간과하여 지나치는 경우가 많다.

√ 그러나, 진정 RDBMS내부를 아는 설계자라면 하나의 컬럼의 data type 및 format을 결정하는데 수 많은 고려를 하게 된다. 매출일자라는 컬럼의 Data type을 character로 지정하여야 하는지, 아니면 date format으로 지정하여야 할지 설계자의 짧은 판단으로 인하여 수많은 개발자와 후손들로부터 지탄의 대상이 되어서는 안된다. 이 부분에 대한 설명(data type의 결정)만으로도 언급해야 될 사항이 많기 때문에 별도의 자료에서 언급하기로 하고 여기서는 Integrity constraint에 대해서만 언급하기로 한다.

√상기 [그림1] 예제에서 속성 무결성을 정의한 DEPT Table을 위한 DDL Script는 다음과 같다.

Create Table DEPT
(deptno
number not null primary key,
dname
varchar(20),
loc
varchar(20))

  • 사용자정의 무결성(User defined Integrity)

DB에 저장된 모든 데이타는 사전 정의된 업무규칙 (Business rule)을 준수해야 한다.

√상기 제약 정의의 대표적인 Constraints는 DDL Script에 사용되는 Check와 Default constraints이다.

√ 또한, 단순한 정의로 DB Internal Processing 에 도움을 얻기가 어려고 정의를 표현하기가 난해하여 적용하기가 어려운 업무규칙에 대해서는 DataBase Trigger를 이용하여 사용자 정의 무결성 보장을 하기도 한다.

√ 예로, 계약일자와 유효시작일자 라는 컬럼은 업무적으로 계약일자 <= 유효시작일자 라는 정의를 지켜야 한다거나, 계약금액은 100,000원 이상만이 들어올 수 있다는 업무 규칙 또한, 아무 값이 지정되지 않고 하나의 Row가 생성될 경우에 특정 컬럼의 값을 초기치(Default) 값으로 자동 입력토록 하는 등, 이러한 일련의 무결성 정의을 하고자 할 경우 설계자의 의도에 맞추어 정의할 수 있다.

√ 상기와 같은 단순한 무결성 정의로는 해결되지 않는 다소 복잡한 무결성 정의을 지정할 경우에는 흔히 사용하는 기법이 바로 DB Trigger이다. DB Trigger에서는 절차적인 판단 및 DML처리를 할 수 있으며, 거의 무제한에 가까운 사용자 정의 무결성 정의를 가능하게 하기 때문에 개발자들이 자주 사용하는 기법 중의 하나이다. 그러나, DB Trigger는 성능상 문제를 극복하기 위해서는 목숨걸고 최적화에 심혈을 기울여야 한다는 것을 명심하여야 한다.

√상기 [그림1] 예제에서 사용자정의 무결성을 정의한 PROJ Table을 위한 DDL Script는 다음과 같다. DB Trigger에 대한 예제는 DBMS 공급업체의 매뉴얼을 참고하기 바란다.

Create Table PROJ
(projno number not null primary key,
projname varchar(20)
check (projname = upper(projname)),
stdt date
check (stdt >= to_date('20000101','yyyymmdd')),
enddt date
check (enddt <= to_date('20000101','yyyymmdd')),
check (stdt <= enddt))

  • 끝으로 이러한 무결성 정의시에는 위에서 필자가 제시한 방법을 그대로 사용하지 말기 바란다. 문제는 이러한 무결성 정의에 대한 제어가 필요할 경우가 도래할 경우를 대비하여 모든 Constraint는 가급적 설계자 Naming Rule에 근거하여 모두다 Constraint name을 지정하여 생성하기 바란다. 이를 위하여 독자께서는 DBMS Vendor에서 제공하는 매뉴얼을 참고하여 향 후 Control이 가능한 정의를 하여야 한다.

'sql' 카테고리의 다른 글

JOIN  (0) 2009.01.08
Mysql Account 생성  (0) 2009.01.07
root 사용자 password 바꾸기  (0) 2009.01.07
mysql 한글지원설정  (0) 2009.01.07
mysql 동시접속자수  (0) 2009.01.07
Posted by 으랏차
,

Mysql Account 생성

sql 2009. 1. 7. 12:25
GRANT 명령으로 DB 사용자 계정만들기...

예전 버젼이 낮을때 까정.. insert 문으로 사용자 계정을 만들었지요..
이젠.. grant 명령으로 간단히 만드세요..^^

mysql> create database 디비명;

mysql> GRANT ALL PRIVILEGES ON 디비명.* TO 아이디@localhost
     - > IDENTIFIED BY '패스워드';

디비명.* 는 해당 디비에 대한 모든 권한을 준다는 것입니다.
디비명을 * 로 하면.. 그 사용자는 모든 권한을 갖게되겠지요..

ALL PRIVILEGES 키워드를 일부 쿼리 유형으로 바꿔주면.. 해당 쿼리만 사용할수 있읍니다.
예로
mysql> GRANT SELECT,INSERT,UPDATE ON 디비명.* TO .............
하면.. 사용자는 SELECT,INSERT,UPDATE 쿼리만 사용할수
있다는 의미겠지요.. ^^ 

'sql' 카테고리의 다른 글

JOIN  (0) 2009.01.08
DB Design시 고려해야 할 제약성(Constraint) 정의  (0) 2009.01.07
root 사용자 password 바꾸기  (0) 2009.01.07
mysql 한글지원설정  (0) 2009.01.07
mysql 동시접속자수  (0) 2009.01.07
Posted by 으랏차
,
=======================================================

  MySQL 의 root 사용자 암호 바꾸기

=======================================================

MySQL 초기 설치시 관리자 암호는 설정 되어져 있지 않다.실질적으로
서비스 할경우엔 반드시 관리자(root) 암호를 설정해야 한다.

root 암호 설정하는 방법에는 3가지가 있다.

1. UPDATE 문 이용하기
2. SET PASSWORD 이용하기
3. mysqladmin 이용하기

▶ UPDATE 문 이용하기

$ mysql -u root mysql

mysql> update user set password=password('new-passwd') where user='root';
mysql> flush privileges;

update 문 이용하여 암호를 변경할땐 꼭 flush privileges; 를 실행
하여 변경된 내용을 적용해야 한다. MYSQL 에서 사용자 권한에 관한
내용은 MYSQL 실행시 메모리에 불러놓고 이용되는데 이에 관해 변경
된 내용이 있을땐 반드시 서버에 변경된 내용을 갱신하라는 명령을
전달해야 한다.


▶ SET PASSWORD 이용하기

mysql> set password for root=password('new-passwd');

이 방법은 flush privileges 가 필요 없다.

▶ mysqladmin 이용하기

root 암호 초기 설정 시 :

$ mysqladmin -u root password new-passwd

root 암호 변경 시 :

$ mysqladmin -u root -p password new-passwd
Enter password:

'sql' 카테고리의 다른 글

DB Design시 고려해야 할 제약성(Constraint) 정의  (0) 2009.01.07
Mysql Account 생성  (0) 2009.01.07
mysql 한글지원설정  (0) 2009.01.07
mysql 동시접속자수  (0) 2009.01.07
mysql tunning  (2) 2009.01.07
Posted by 으랏차
,

mysql 한글지원설정

sql 2009. 1. 7. 12:23
세가지 방법이 있어요.

(./configure --with-charset=euc_kr 로 컴파일 했을경우)


1.
mysql.server 파일을 열어서 다음 내용을 수정 (2~3군데 정도 됨)

==> 'mysqld' 부분을 mysqld --language=korean

2.
또는, 옵션 설정파일 'my.cnf'에 다음 내용을 삽입

==> [myslqd] 셕션에 아래와 같은 한 줄을 넣는다.

language=korean

3.
또는 mysqld 실행할때 옵션을 줘서 실행

mysql --langueage=korean 

'sql' 카테고리의 다른 글

Mysql Account 생성  (0) 2009.01.07
root 사용자 password 바꾸기  (0) 2009.01.07
mysql 동시접속자수  (0) 2009.01.07
mysql tunning  (2) 2009.01.07
mysql  (0) 2009.01.07
Posted by 으랏차
,

mysql 동시접속자수

sql 2009. 1. 7. 12:23
리눅스 Q&A자료실에 올라왔던 내용이기도 합니다.

인터넷 사용자들이 많아지면서 인기있는 웹 사이트에서는

Max connections 에러가 발생되는 것을 볼 수있을겁니다.

우선, MySQL은 동시에 연결될 수 있는 클라이언트의 수가

100입니다.

이런 에러가 발생한다면 먼저 접속되어있는 클라이언트의 수를
확인하셔야겠죠. 확인방법은 아래와 같습니다.
$ mysqladmin -u root -p variables | grep max_connection

| max_connections                 | 100

이제는, 클라이언트의 동시 접속자를 늘리는 명령입니다.
먼저 mysqld - 이 데몬을 kill 하셔야 겠죠...
$ safe_mysqld -O max_connections=200 &
참고로, 리눅스나 솔라리스 계열에서는 클라이언트의 동시 접속자수가 500 ~ 1,000 까지 가능하다고 합니다.

이렇게 하신 후 다시 확인합니다.
$ mysqladmin -u root -p variables | grep max_connection

그럼 제한되어 있지만 원하시는 만큼의 동시접속자 수를

늘리시게 된겁니다.

'sql' 카테고리의 다른 글

root 사용자 password 바꾸기  (0) 2009.01.07
mysql 한글지원설정  (0) 2009.01.07
mysql tunning  (2) 2009.01.07
mysql  (0) 2009.01.07
Mysql Data Type  (1) 2009.01.07
Posted by 으랏차
,

mysql tunning

sql 2009. 1. 7. 12:06
1.반드시 컴파일 하라! 10-30% 속도 향상 !
소스를 가지고 컴파일 하세요. MySQL 메뉴얼에 따르면 10-30% 속도가 빠르다고 합니다. RPM 이나 바이너리 설치를 하지 마세요 !  

1-2.최신 버전을 사용하라
최신 버전이 좋은 점은 자동 튜닝 하는 것 입니다. 버그를 수정 하구요. 되도록 이면 최신 버전을 사용하세요 !!

2. HEAP 테이블이 가장 빠르다!
일반적으로 가장 많이 쓰이는 테이블 타입은 MyISAM 타입 입니다. MyISAM 타입은 무자게 빠르며, 대용량에도 강합니다. 그러나 트랜잭션은 지원되지 않습니다. 이노디비(InnoDB) 는 트랜잭션이 지원 됩니다. 쇼핑몰에서는 반드시 사용해야 합니다

^^ HEAP 테이블 타입은 가장 빠르며, 단점은 메모리에 있기 때문에, MySQL에 중지 될 경우 모두 날아 갑니다. 검색을 하고 재검색을 다시 하는 경우, 임시 검색 테이블을 만들어 놓는 것도 좋은 방법입니다.  


HEAP 테이블 메뉴얼 !
http://www.mysql.com/doc/H/E/HEAP.html

HEAP 테이블 만들기 !
mysql>CREATE TABLE email_addresses TYPE=HEAP
(     ->email char(55) NOT NULL,    
       ->name char (30) NOT NULL,    
       ->PRIMARY KEY(email) );  


3.mysql 서버 top 보기
mysql  서버의 메모리 상황을 보여 주는 프로그램 입니다. 리눅스나 유닉스의 top 기능을 mysql 에서 가능하게 한것 입니다

. top 정보는 튜닝의 기본 이기 땜시 자주 자주 보아야 합니다. ^^ http://public.yahoo.com/~jzawodn/mytop/ PHP 소스 자료실에 파일 다운 로드 하시면 됩니다.  


4.mysql_connect Vs mysql_pconnect
서버 메모리가 최소 2G 이상일 경우 mysql_pconnect 를 추천 함다 ! 연결을 계속 하지 않기 땜시 빠릅니다. ! 그러나 메모리가 2G 이하 일 경우는 mysql_connect 사용하세요 !  


5.int,smallint,tinyint 데이터형 !  
int 는 굉장히 큰수 입니다. 4바이트를 차지 하구요. tinyint 는 몇백 까지만 됩니다. 1바이트 구요. 쓸데 없이 int 를 사용하지 마세용 !! 4바이트와 1바이트는 4배 차이 입니다.조그만것 1개 1개가 모여 서버 부하를 일으 킵니다.!! 데이터 량이 얼마만큼 들어가는지 체크 하고 데이터형을 선택 하세요 ^^ 만약 쓸데없는 데이터 형이다 싶으면 alter table 로 데이터 형을 바꾸세요 !  


6.인덱스의 사용  
인덱스는 반드시 필요한 곳에만 넣으세요 ! 인덱스를 줄 경우 하드 용량을 더 차지 하기 때문에 속도를 떨어 뜨릴 수 있습니다. 모든 칼럼에 인덱스를 주는 것은 절대 추천 하지 않습니다. 1개의 테이블에 주키외에 2-3 개 이상의 인덱스는 주지 마세요! 주키는 당근 인덱스 입니다. ^^

CREATE TABLE albums (     id        INTEGER      NOT NULL AUTO_INCREMENT

PRIMARY KEY,     title     VARCHAR(80)NOT NULL,          INDEX title_idx (title) ); ☞Alter Table 로 인덱스 추가

ALTER TABLE albums ADD INDEX title_idx (title)    결합 인덱스의 경우 너무 많은 인덱스를 사용할 경우 CPU 오버헤드나 하드 오버헤드를 불러 일으 킵니다. 적당히 사용하세요 ^^  

http://www.mysql.com/doc/I/n/Indexes.html
http://www.mysql.com/doc/M/u/Multiple-column_indexes.html
http://www.mysql.com/doc/O/R/ORDER_BY_optimisation.html


6-1. 바보 같은 인덱스의 사용 ?  
인덱스는 %$search% 가 먹지 않습니다. 그런디 게시판 제목(Subject) 에 인덱스 걸어 놓고 , 검색을 %$search% 이렇게 하면 될까요? 인덱스 거나 안거나 똑같습니다. !! $search% 이렇게 사용하세요. 그런디.. $search%  사용하면 제목 처음 단어 밖에 검색이 안됩니다. 그렇다면 ? 다른 검색 방법은 ?  


7.UDF의 사용  
MySQL은 스토어드 프로시져 같은 개념이 존재 하지 않습니다. 그대신 C 언어로 만든 함수를 사용할 수 있습니다. 조금더 빠른 쿼리를 원한다면 UDF 를 사용해보세요 !  

UDF 함수 보기  
http://empyrean.lib.ndsu.nodak.edu/~nem/mysql/udf/

http://www.mysql.com/doc/A/d/Adding_functions.html

스토어드 프로시져가 먼뎅?
스토어드 프로시져는 쉽게 말해 MS-SQL 함수 입니다.
오라클에도 아마 있을검당..^^

그러니까 게시판에서 내용을 넘길때나 불러 올때
mysql 쿼리가 3-4 번 정도 이루어 집니다. 또는 ms- sql 쿼리가 이루어지죵..
3-4 번 정도 쿼리가 되면..그만큼 디비 접속이 잦아 지기 때문에..
속도가 느려 집니다.

많게는 10번 정도의 insert into 와 update 가 이루어집니다.

그래서 ms - sql 자체 내에 인서트 함수 나 목록 보기 함수를 만들어 놓습니다.
글구 1번의 ms-sql 접속만 해서 인서트 함수를 불러서 처리하는 것입니다.

그렇기 때문에 2-3 번의 쿼리가 절약 되서 빠르다는 것이죵..ㅋㅋㅋ
또는 10번의 쿼리 할것을 MS-SQL 스토어드 프로시져를 1번만 호출 함으로 해서 디비 접속이 절약이 되죵..ㅌㅌ

UDF 를 꼭 사용해야 하는가? 안해도 됩니다.만... 사용하면 좋은점 많습니다. 새로운 함수를 추가 할 수 있으므로 ^^ MS-SQL의 스토어드 프로시져 기능 비스므리 하게 사용할 수 도 있구요... UDF 나 MS-SQL 스토어드 프로시져의 사용법을 익히기 보다는 캐슁을 연구하세용 ^^ 동적인 PHP 를 정적인 HTML 로 만드는 방법을요... 또는 UDF 에서 MS-SQL 스토어드 프로시져 처럼 사용이 가능 합니다. 그 부분을 연구하세요. www.zdnet.co.kr 이나 www.zdnet.com 가시면 기사 파일이 1000,29920,2892.html 파일 이란것을 보게 됩 니다. 어키 구현된것일까요? zdnet 게네 들은 강좌를 원래 부터 HTML 로 만들어서 올리는 것일까용?? HTML 로 만드는 부분도 많이 생각 해야 합니다. 강좌가 1만개 라면, 1만개의 파일이 생성 됩니다.

zdnet 의 경우는 조회수가 10만-20만을 넘는 초대형 사이트 이기 때문에 HTML 로 만드는 것이 퍼포먼스가 좋습니 다. UDF

배워 두면..남주지 않습니다.  


8.조인보다는 쿼리를 나누어라!  
조인(Join)하는 것보다 쿼리를 2개로 나누는 것이 속도가 빠릅니다. 조인을 생각 하기 이전에 쿼리를 나누는 것을 생각 하세요 ^^ 어쩔 수 없는 경우는 당근 조인 해야죠. 글고 서브쿼리는 아직 지원 안됩니다. Ms-SQL이나 오라클에서 서브쿼리 보다는 서브쿼리를 하지 않는 방향의 데이터 정규화를 하세요 ^^ 조인 보다 서브쿼리가 느리다. 서버 쿼리 보다는 조인을 사용하세요 ^^  

9.full text index와 search  
3.23.23 부터 mysql 에서는 full text index 를 지원 합니다. 자세한 사항은 아래 !  
http://www.mysql.com/documentation/mysql/bychapter/manual_Reference.html#Fulltext_Search
http://www.mysql.com/doc/F/u/Fulltext_Fine-tuning.html


10. SELECT * FROM sometable
SELECT * FROM sometable 에서 * 모든을 사용하는 것은 무식한 방법 입니다. 모든 칼럼을 불러오는 경우는 드물거든요.

SELECT code,tadate,see FROM sometable 사용할 것만 불러 오세요 ^^  

11.데이터베이스 정규화  
테이블을 아무렇게나 만들면 안됩니다. 데이터베이스 정규화 원칙에 의거, 테이블을 나눌것은 나누고 만드시는 것이 좋습니다. 제1 정규화, 제2 정규화 정도는 사용하셔야 합니다. 게시판을 만들때 아직도 테이블 1개에 만드시나요? 온라인 폴 만들때 , 테이블 1개에 만드시나요?  


12.REPLACE INTO문 사용하기
REPLACE INTO albums VALUES (6, 'tood.net')     insert 문대신에 replace 문을 사용해보세요. 메뉴얼 보시고 연구하세요

^^ 주키일 경우 사용하시면 됩니다.  

13. explain 사용하기  
explain 를 사용하여 테이블의 키 값이 얼마나 잘 활용 되는지 알 수 있습니다. EXPLAIN SELECT, SHOW VARIABLES, SHOW

STATUS, SHOW PROCESSLIST  
http://www.mysql.com/doc/E/X/EXPLAIN.html


17.BLOB과 TEXT는 분리하라
BLOB과 TEXT 칼럼은 테이블을 분리 하는 것이 좋다. 다른 칼럼의 내용 보다 크기 때문이다 ! OPTIMIZE TABLE 명령을 자주 사용해라 ! Not null 로 지정 하는 것이 빠르다. varchar 보다 char 이 훨빠르다.

'sql' 카테고리의 다른 글

mysql 한글지원설정  (0) 2009.01.07
mysql 동시접속자수  (0) 2009.01.07
mysql  (0) 2009.01.07
Mysql Data Type  (1) 2009.01.07
mysql query  (0) 2009.01.07
Posted by 으랏차
,