SQL/MySQL

[mysql] 다대다 관계에 대한 고찰 1

http://portfolio.wonpaper.net 2020. 7. 10. 03:08

실무상에서 DB 구성시 꼭 알아두어야 할 내용이 다대다 관계의 DB 구성내용이다. 

Mysql 뿐만 아니라 다른 관계형 데이터베이스에서 공통으로 적용되는 아주 중요한 내용이다. ~

 

예를 들어 강사와 과목의 DB 를 구성한다고 하면, 이러한 (多)대다(多) 관계의 좋은 예라 하겠다.

 

홍길동 강사가 수학, 국어를 가르칠수도 있고, 또한 국어를 가르치는 강사가 홍길동 뿐만 아니라 강감찬, 이순신도 있을 수 있다. 

 

 

상하 관계가 있는 1대다 관계와 다른 상황이다.

 

이를 DB로 깔끔하게 구성하는 방법은 1:다:1 로 DB 를 재구성하는 것이다.

 

이렇게 1:다:1 관계로 DB 를 구성하게 되면, 홍길동 1명에 중간 다 테이블에 성적,시험일자 등의 칼럼을 구성할 수 있으며, 수학 1개로 만들 수 있다. 

 

다음 아래는 나름대로 간단하게나마, Mysql 과 PHP 소스 형태로 한번 틀만 구성해 보았다.

 

[강사 테이블]

[과목 테이블]

 

[강사 와 과목의 1:다:1 테이블]

 

내부 조인 Inner join 형태로 lecturer (강사) 와 lecturer_cate_in (강사와 과목의 1:다:1 테이블) 결합하여, 

해당 이종원 강사의 과목을 연결해 주고 있다. 

 

그리고, mysql 과 PHP 형태로, 해당 강사 목록 페이지를 구성할때 과목 검색 기능을 연동하고자 할때, 

아래와 같이 소스를 구성할 수 있겠다. 

 

위의 그림예에서, 방과후지도사 (lcate_no 가 2번) 를 클릭하여 검색하면 해당 강사 목록을 불러오는 쿼리는 아래와 같다. 

select A.lno,A.name,A.hp,A.lec_pic1 from lecturer A , (select lcate_no,lno from lecturer_cate_in B where lcate_no=2) B where A.lno=B.lno

 

 

마지막으로 PHP 형태로 간략히 종합적인 강사목록 소스를 간추려보았다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
<?
$page         = ($_GET[page])? $_GET[page] : $_POST[page];
$sname         = ($_GET[sname])? $_GET[sname] : $_POST[sname];
$ssubject2     = ($_GET[ssubject2])? $_GET[ssubject2] : $_POST[ssubject2];
 
$show_page  = 20;
$block_page = 10;
 
$keyGap = " where A.useyo='y'  ";
 
if ($sname || $ssubject2) {
 
    if ($sname) {
        $keyGap .= " and A.name like '%".$sname."%'";
    }
 
    if ($ssubject2) {
        $keyGap = " , (select lcate_no,lno from lecturer_cate_in B where lcate_no=".$ssubject2.") B " . $keyGap" and A.lno=B.lno";
        
    }
 
//$tQ = "select count(*) from lecturer A , (select lcate_no from lecturer_cate_in B where lcate_no=2) B ";
$tQ = "select count(*) from lecturer A $keyGap";
$tresult = mysql_query($tQ) or die("강사 카운트 정보 얻기 실패");
$trow     = mysql_fetch_row($tresult);
$total     = $trow[0];
 
if(!$page$page = 1;
$start = ($page-1)*$show_page;
$total_page = (int)(($total-1)/$show_page)+1;
 
// select A.lno,A.name,A.hp,A.lec_pic1 from lecturer A , (select lcate_no from lecturer_cate_in B where lcate_no=2) B 
// select A.lno,A.name,A.hp,A.lec_pic1,B.lcate_no,B.cate_name from lecturer A , (select lcate_no,cate_name from lecturer_cate_in B where lcate_no=2) B
$query = "select A.lno,A.name,A.hp,A.lec_pic1 from lecturer A $keyGap  order by A.lno DESC limit $start,$show_page";
$result = mysql_query($query) or die("강사 정보 얻기 실패");
 
?>
 
cs