일일 정리

정규화와 모델링, 논리 모델링 구성, PHP - 오라클 DB 연동

mysecurity 2025. 3. 22. 20:40

목차

1. 정규화와 모델링

1-1 정규화 개요

1-2 정규화 과정

 

2. 논리 모델링 구성

2-1 개체

 

 

+ (2025-03-23 추가)

3. PHP - 오라클 DB 연동

3-1 브라우저에서 DB로 데이터 입력

3-2 DB에서 브라우저로 데이터 출력

 

 

1. 정규화와 모델링

1-1 정규화 개요

정규화는 데이터를 구성할 때 요소들이 함수적 종속 관계를 유지하도록 만드는 과정으로, 데이터 구조의 안정성을 확보하고 무결성을 유지하며 저장 공간을 최소화한다.

 

● 정규화 장점

- 모델의 정확성

- 데이터 일치

- 모델의 단순성

- 중복의 최소화

 

● 함수적 종속

레코드 내에 존재하는 항목들 중에 속성 B가 속성 A에 함수적 종속 관계에 있다는 것은 A를 이용해 B를 식별할 수 있다는 의미이다.

- A  → B

- A : 결정인자(Determinant)

          결정인자가 여러 속성인 경우 최대한 속성이 적게 조정이 필요하다.

          결정인자는 임의로 설정된 경우가 많다. ex) 군번, 주민번호 등

ex)

제품번호 → 제품명

학번 → (이름, 학과, 주소, 전화번호)

(학번, 과목번호) → 점수

 

1-2 정규화 과정

※ 용어 정의

식별관계     : 외부 식별자가 주식별자에 있는 관계
비식별관계  :  외부 식별자가 일반 속성에 있는 관계

 

완전 기능 종속 : 하나 이상의 주식별자에 함수적 종속 관계가 확실한 것

이행 종속         : 주식별자에 함수적 종속 관계가 아닌 것

 

● 1차 정규화

: 반복 그룹 속성을 추출한다.

 

- 자식 개체가 추출되며 반드시 식별관계이다.

- 주식별자를 가지고 나간다.

- 자식 개체 주식별자에 반드시 속성이 추가된다.

1차 정규화

 

● 2차 정규화

: 주식별자에 완전 기능 종속되지 않는 속성을 추출한다. 

: 주식별자에 의미있는 속성이 여러 개 있어야 2차 정규화를 진행한다.

 

- 자식 개체 주식별자에 외부 식별자를 두고 나간다.

- 부모 개체가 추출되며 반드시 식별관계이다.

2차 정규화

 

● 3차 정규화

주식별자에 이행 종속인 속성을 추출한다.

 

- 일반 속성에 외부 식별자를 두고 나간다.

- 부모 개체가 추출되며 반드시 비식별관계이다.

3차 정규화

 

 

2. 논리 모델링 구성

2-1 개체

개체는 관리 대상이 되는 정보를 가지고 있거나 정보의 대상이 되는 유/무형의 사물이나 객체로 DB에서는 테이블을 나타낸다.

 

● 개체의 특징

- 상호 배타성

: 모든 튜플은 하나의 개체에만 속해야 한다.

→ 사원과 관련된 정보는 하나의 테이블에 속해있어야 한다.

 

- 식별성

: 개체 내의 모든 튜플은 식별자에 의해 식별이 가능해야 한다.

→ 행 안의 모든 데이터는 식별자에 의해 식별이 가능해야 한다.(= 함수적 종속 관계 유지)

 

● 개체 유형

- 기본 개체 (핵심 개체)

: 학생, 부서, 사원 등과 같이 기본 정보를 포함한 개체이다.

 

- 개념 개체

: 업무 처리나 흐름을 위해 무형의 과정이나 개념을 위해 만들어진 개체이다. ex) 가상의 일련번호

 

- 교차 개체 (관련 개체)

: 두 개체 간의 관계를 위해 만들어지는 개체이다. 개체 간 관계가 다대다 관계라면 그 중간에 뭔가 있다는 것이며 그것이 교차 개체이다.

: 다대다 관계를 해소하는 역할을 한다.

 

● 개체 구분

- '상위 개체 : 하위 개체' 혹은 '부모 개체 : 자식 개체' (상대적 개념)

- '독립 개체 : 종속 개체'

 

독립 개체는 누군가를 참조하지 않고 혼자 존재할 수 있는 개체로 최상위 개체라고도 한다.

종속 개체는 누군가를 참조하는 개체이다.

 

● 개체 정의

- 선입견을 버린다.

- 명확한 의미를 정의한다.

- 서류, 인터뷰 등을 기본 자료로 이용한다.

- 상부에서 사용하는 말을 사용한다. (top - down 방법)

 

● 개체 정의 요소

- 개체 명칭

- 개체 설명과 의미

- 약어 및 동의어

- 차후 데이터 출현량에 대한 예측

 

● 개체 정의 시 주의 사항

- 단일 사례를 개체로 만들지 않는다. 

  : 한 행으로 구성할 내용을 테이블로 만들지 않는다.

 

- 개체가 고립되지 않도록 한다.

 

- 동의어를 각각의 개체로 만들지 않는다.

  : 식별자 외에 동일한 속성을 가진 개체를 생성해서는 안된다.

 

 


+ (2025-03-23 추가)

3. PHP - 오라클 DB 연동

3-1 브라우저에서 DB로 데이터 입력

다음과 같이 html로 데이터 입력 폼을 만들어 데이터를 입력받고 php파일을 통해 데이터베이스에 데이터를 저장할 수 있다.

 오라클 연동을 위해 각 프로그램에서 호출 할 접속 프로그램 php

입력 프로그램에게 호출되어 오라클 DB에 접속할 수 있도록 한다.

// conn.php //

<?
  $server = "oracle";
  $user = "php";
  $passwd = "php";
  $charset = "AL32UTF8";
  $conn=@oci_connect($user, $passwd, $server, $charset) or die('Could not connect:');
?>

 

6행 $conn=@oci_connect($user, ...);

: @ 표시는 함수 에러가 발생해도 에러 메시지를 보여주지 않도록 한다.

 

 

● student(학생) 테이블 데이터 입력 폼 html

POST 방식으로 php파일에 입력값을 전달한다.

// st_in.html //
 
 <html><head>
 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
 <title> student 입력폼 </title>
 </head>
 <body bgcolor="white" text="black" link="blue" vlink="purple" alink="red">
 <form name="insert" action="st_in.php" method="POST">     
 <table  border="0" width="250">
   <tr>
      <td width="50"><p align="center">학번</p></td>
      <td>&nbsp;&nbsp;<input type="text" name="sno"></td>
   </tr> 
   <tr>
      <td width="50"><p align="center">이름</p></td>
      <td>&nbsp;&nbsp;<input type="text" name="sname"></td>
   </tr> 
   <tr>
      <td width="50"><p align="center">성별</p></td>
      <td>&nbsp;&nbsp;남<input type="radio" name="sex" value="남">,
              여<input type="radio" name="sex" value="여"></td>
   </tr> 
   <tr>
      <td width="50"><p align="center">학과</p></td>
      <td>&nbsp;&nbsp;<select name="major" size="1">
                         <option value="화학">화학</option>
                         <option value="생물">생물</option>
                         <option value="물리">물리</option>
                         <option value="유공">유공</option>
                         <option value="식영">식영</option></td>
   </tr> 
   <tr>
      <td width="50"><p align="center">학년</p></td>
      <td>&nbsp;&nbsp;1<input type="radio" name="syear" value="1">,
              2<input type="radio" name="syear" value="2">,
              3<input type="radio" name="syear" value="3">,
              4<input type="radio" name="syear" value="4"></td>
   </tr> 
   <tr>
      <td width="50"><p align="center">학점</p></td>
      <td>&nbsp;&nbsp;<input type="text" name="avr"></td>
   </tr> 
   <tr>
      <td colspan="2">
       <p align="center"><input type="submit" name="확인" value="확인"></p>
      </td>
   </tr> 
 </table>
 </form>
 </body></html>

 

 

 

● student(학생) 테이블 데이터 입력 프로그램 php

오라클 DB 접속 프로그램(conn.php)을 호출하고 html파일에서 전달받은 입력값을 DB에 입력한다.

// st_in.php //

<?  
  $sno = $_POST['sno'];        
  $sname = $_POST['sname'];
  $sex = $_POST['sex'];
  $major = $_POST['major'];
  $syear = $_POST['syear'];
  $avr = $_POST['avr'];
  
  require('conn.php');   
  
  $sql="insert into student (sno, sname, sex, major, syear, avr)
        values ('$sno', '$sname', '$sex', '$major', $syear, $avr)";
        
  $result=oci_parse($conn,$sql);                 
  $re=oci_execute($result);      
  
  oci_free_statement($result);
  oci_close($conn);
  
  if($re) echo("정상 입력 되었습니다.");
 //  echo(" <meta http-equiv='Refresh' content = '0; URL=st_vi.php'>");
?>

 

9행  require('conn.php');

: conn.php 파일을 호출해 실행한다.

 

14, 15행  oci_free_statement($result);  oci_close($conn);

: sql문을 파싱하여 실행 계획을 생성하고 그 계획대로 실행시키는 문장으로 무조건 이와 같은 형태로 작성한다.

 

 

3-2 DB에서 브라우저로 데이터 출력

다음과 같이 php를 통해 오라클 DB에 저장된 데이터를 브라우저로 출력할 수 있다.

 

● student(학생) 테이블 데이터 출력 프로그램 php

// st_vi.php //

<?
  echo("<a href=./st_in.html>자료 입력하기</a><hr>");
  
  require('conn.php');
  
  $sql="select sno,sname,sex,major,syear,avr  
        from student order by sno";          
  
  $result=oci_parse($conn,$sql); 
  oci_execute($result);                 
                                             
  while ($row = oci_fetch_array($result,OCI_NUM)){
         echo("$row[0]-$row[1]-$row[2]-$row[3]-$row[4]-$row[5] <br>");
  }
  oci_free_statement($result);  
  oci_close($conn);
?>

 

12행 while문

: 처음은 배열 $row에 테이블의 첫 행을 가져오며 이후 while문 실행마다 그 다음 행을 가져오는 것을 반복한다. 더이상 가져올 행이 없으면 while문을 빠져나온다.

 

13행 echo문

: $row 테이블의 각 컬럼의 데이터를 출력한다.

 

● student(학생) 테이블 데이터 출력 프로그램 php 개선

13행 echo 문의 경우 배열의 키값이 숫자로 표현되어 직관적으로 어떤 컬럼인지 알아보기 힘들다. 그러므로 다음과 같이 배열의 키값을 문자로 작성하여 php를 개선할 수 있다.

// st_vi.php 개선 //

<?
  echo("<a href=./st_in.html>자료 입력하기</a><hr>");
  require('conn.php');
  $sql="select sno, sname, sex, major, syear, to_char(avr,'0.00') avr 
        from student order by sno";     
  
  $result=oci_parse($conn,$sql);        
  oci_execute($result);
  
  echo("<table border='0'>");       
  while ($row = oci_fetch_array($result, OCI_ASSOC)){  
         echo("
               <tr> 
                  <td width='50'><p align='center'>{$row['SNO']}</p></td> 
                  <td width='80'><p align='center'>{$row['SNAME']}</p></td>
                  <td width='20'><p align='center'>{$row['SEX']}</p></td>
                  <td width='20'><p align='center'>{$row['SYEAR']}</p></td>
                  <td width='50'><p align='center'>{$row['MAJOR']}</p></td> 
                  <td width='30'><p align='center'>{$row['AVR']}</p></td>
               </tr>
              ");
        }
  echo("</table>");
  oci_free_statement($result);  
  oci_close($conn);
?>