วันอาทิตย์ที่ 23 พฤศจิกายน พ.ศ. 2557

การเขียน PHP เชื่อมต่อฐานข้อมูล MySQL

   สำหรับบทความนี้จะพูดถึงการเขียน PHP เพื่อเชื่อมต่อฐานข้อมูลแบบง่ายๆ ด้วยหลักการพื้นฐานเขียนทีละบรรทัด ทีละฟังก์ชั่นเพื่อให้เข้าถึงข้อมูลในฐานข้อมูล MySQL ได้




การเขียน PHP เชื่อมต่อฐานข้อมูล MySQL


PHP กับการเชื่อมต่อฐานข้อมูล MySQL 




connect.php

<html>
<head>
<title>SunZan-Desgin.Com</title>
</head>
<body>
<?php
 $conn = mysql_connect("localhost","root","123456");
 if($conn )
 {
  echo "เชื่อมต่อฐานข้อมูลเรียบร้อย.";
 }
 else
 {
  echo "ไม่สามารถเชื่อมต่อฐานข้อมูลได้.";
 }

 mysql_close($conn );
?>
</body>
</html>


แต่การนำไปใช้จริง เราไม่จำเป็นต้อง echo ข้อความแจ้งว่าเชื่อมต่อเรียบร้อยก็ได้ แล้วค่าที่ส่งเข้าไปในฟังก์ชั่นควรกำหนดเป็นตัวแปรเพื่อง่ายต่อการแก้ไข


connect.php

<html>
<head>
<title>SunZan-Desgin.Com</title>
</head>
<body>
<?php
$host = "localhost";
$user = "root";
$pass = "123456";
$dbname = "db_student";

$conn = mysql_connect($host,$user,$pass) or die( "ไม่สามารถติดต่อฐานข้อมูลได้ ". mysql_error());



mysql_select_db($dbname) or die("เชื่อมต่อฐานข้อมูลไม่ได้ ". mysql_error());



//แสดงข้อมูลจากตารางห้องเรียน

$sql="select * from tb_class order by title_club ASC";

$result=mysql_query($sql); 

while ($w=mysql_fetch_array($result)) {

    $id_club=$w[id_class]; 

    $title_club=$w[title_class];

    echo "
", $id, " : ", $title;

}
mysql_close($conn );
?>
</body>
</html>


เราจะเห็นข้อความแจ้งเตือนก็ต่อเมื่อไม่สามารถเชื่อมต่อกับฐานข้อมูลเท่านั้น เพื่อให้ทราบถึงข้อขัดข้องในการทำงานขณะนั้น


mysql_select_db($dbname);

คือการเรียกใช้ฐานข้อมูลที่กำหนดตามตัวแปรคือ db_student


หลังที่ที่เราเลือกฐานข้อมูลแล้ว ก็จะสามารถเรียกดูข้อมูลจากตารางต่างๆ เพื่อนำมาทำรายงาน หรือเพิ่ม ลบ แก้ไขข้อมูลด้วยคำสั่งต่างๆ ของ SQL ซึ่งสามารถหาดูตัวอย่างได้จากเว็บไซต์ที่สอบเขียนโปรแกรม php หลายๆเว็บ

การรับตัวแปรจากแบบฟอร์ม ส่งค่าไปยังไฟล์ PHP

การรับค่าจากแบบฟอร์มนั้น PHP จะใช้ตัวแปรอยู่ 3 แบบด้วยกันคือ $_GET, $_POST, $_REQUEST ซึ่งแต่ละแบบจะมีการส่งค่าดังนี้

1. $_GET จะส่งค่าผ่าน URL เราจะเห็นพารามิเตอร์ที่ส่งไปต่อท้าย URL ของหน้านั้นๆ
2. $_POST จะส่งแบบไม่แสดงพารามิเตอร์ให้เห็น 
3. $_REQUEST จะเป็นตัวแปรที่ใช้รับค่าทั้งที่ส่งมาแบบ $_GET และ $_POST


สำหรับขั้นตอนการค้นหาข้อมูลเพื่อนำมาทดสอบ เราจะใช้คีย์เวิร์ดดังนี้ 
เข้าไปที่เว็บไซต์ www.google.co.th แล้วค้นหาคำว่า "php การรับค่า ฟอร์ม"


จากนั้นก็ลองนำซอร์สโค๊ดตัวอย่างมาทดลองดูว่าได้ผลอย่างไรบ้างและแตกต่างกันอย่างไร

form.html
<html>
   <head>
       <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
       <title>ทดสอบ การรับค่าผ่านฟอร์ม คำนวณพื้นที่สี่เหลี่ยม</title>
   </head>
   <body>
  <form action="test.php?id=5" method="post" name="frm_data">
    <table width="500">
   <caption><h3>ทดสอบ การรับ-ส่งค่าผ่านฟอร์ม</h3></caption>
   <tr>
    <td align="right">ชื่อเล่น :</td><td><input name="nickname" type="text" /></td>
   </tr>
     <tr>
    <td align="right"> เบอร์โทร :</td><td><input name="telephone" type="text" /></td>
   </tr>
   <tr>
    </td><td><td><input name="but_submit" type="submit" value="ส่งค่า" /></td>
   </tr>
   </form>
</body>
</html>
test.php 
<?php
echo '<div style="font-size:14px">';

echo '--------------------------------------------------------------------';
echo '<pre>';
echo '<b>แสดงค่าตัวแปร  id</b>', "\n";
echo '$_GET[\'id\'] = ', $_GET['id'], "\n";
echo '$_POST[\'id\'] = ', $_POST['id'], "\n";
echo '$_REQUEST[\'id\'] = ', $_REQUEST['id'], "\n";
echo '</pre>';
echo '--------------------------------------------------------------------';

echo '<pre>';
echo '<b>แสดงค่าตัวแปร  nickname</b>', "\n";
echo '$_GET[\'nickname\'] = ', $_GET['nickname'], "\n";
echo '$_POST[\'nickname\'] = ', $_POST['nickname'], "\n";
echo '$_REQUEST[\'nickname\'] = ', $_REQUEST['nickname'], "\n";
echo '</pre>';
echo '--------------------------------------------------------------------';

echo '<pre>';
echo '<b>แสดงค่าตัวแปร  telephone</b>', "\n";
echo '$_GET[\'telephone\'] = ', $_GET['telephone'], "\n";
echo '$_POST[\'telephone\'] = ', $_POST['telephone'], "\n";
echo '$_REQUEST[\'telephone\'] = ', $_REQUEST['telephone'], "\n";
echo '</pre>';
echo '--------------------------------------------------------------------';

echo '</div>';
?>
การรับตัวแปรจากแบบฟอร์ม ส่งค่าไปยังไฟล์ PHP


1. สังเกตว่า test.php?id=5 มีการส่งค่าแปร id ที่อยู่ต่อท้ายเครื่องหมาย ? มาด้วย ซึ่งข้อมูลหลังเครื่องหมายนี้จะรับค่าเป็นตัวแปร $_GET

2. ส่วนข้อมูลในแบบฟอร์มที่ให้กรอก เรากำหนดให้ METHOD ของ FORM เป็นแบบ POST ดังนั้นค่าที่ส่งมาจึงไม่ปรากฏใน URL ด้านหลัง ?

3. สำหรับตัวแปรที่ 3 $_REQUEST สามารถรับค่าได้ทั้งแบบส่งมาแบบ GET และ POST 

ข้อมูลชนิดอาร์เรย์ PHP Array

 ข้อมูลชนิดอาร์เรย์

       ข้อมูลอาร์เรย์ เป็นรูปแบบข้อมูลที่มีความสำคัญมาก กับงานเขียนโปรแกรม จะใช้เก็บข้อมูลที่มีหลายมิติ หรือจะให้เข้าใจง่ายๆ ให้มองภาพของตาราง ที่มีหลายๆคอลัมน์ เช่น นักเรียน 1 คนมีข้อมูล ชื่อ นามสกุล ชั้นเรียน เกรดเฉลี่ย ที่อยู่ และข้อมูลอีกหลายอย่าง ดังนั้นการจะประกาศตัวแปรตามจำนวนข้อมูลทุกตัวนั้น จะเสียเวลาและเปลืองตัวแปรอย่างมาก 

       ดังนั้น การประกาศตัวแปรให้เป็นแบบ Array จึงช่วยให้งานเขียนโปรแกรมนั้นดูเป็นระเบียบเรียบร้อย และยังเรียกใช้งานได้สะดวก อย่างเช่นการดึงข้อมูลนักเรียนจากฐานข้อมูล เรามักจะพักข้อมูลไว้ในตัวแปรซึ่งจะเป็นแบบ Array เสมอ

ตัวอย่างการสร้างข้อมูลแบบ Array ในภาษา PHP 
<?php
$student['computer'] = array(
  array('name'=>'นางสาวณริณี ศักดิ์ดา', 'grade'=>'3.01', 'tel'=>'081-234-5678'),
  array('name'=>'นายณรงศักด์ อ่อนไหว', 'grade'=>'2.79', 'tel'=>'081-234-5679'),
  array('name'=>'นายทรงพล ยืนยง', 'grade'=>'2.56', 'tel'=>'081-234-5680'),
);
?>
ในตัวอย่างจะเป็นข้อมูลนักเรียน 3 คน ที่เรียนในสาขาคอมพิวเตอร์
ซึ่งแต่ละคนจะมีข้อมูล ชื่อ เกรดเฉลี่ย และเบอร์โทร
การที่เราจะแสดงข้อมูลออกมานั้น จะต้องทำการวนลูปให้ครบทุกแถว
ซึ่งวิธีที่ผมใช้บ่อยที่สุดคือ การใช้ foreach() 
<?php
echo '<table border="1" cellpadding="3" cellspacing="0">';
echo '<tr style="background-color: #aaaaaa;">';
echo '<th>ชื่อ-นามสกุล</th><th>เกรดเฉลี่ย</th><th>เบอร์โทรศัพท์</th>';
echo '</tr>';
foreach($student['computer'] as $arr){
    echo '<tr>';
    echo '<td>'.$arr['name'].'</td>';
    echo '<td>'.$arr['grade'].'</td>';
    echo '<td>'.$arr['tel'].'</td>';
    echo '</tr>';
}
echo '</table>';

?>
ได้ผลลัพธ์ ดังนี้ 

ตัวอย่างที่ 2
<?php
$status1 = 'new';
$status2 = 'read';
$status3 = 'reply';

$statusText = array('new' => 'ข้อความใหม่', 'read' => 'อ่านแล้ว', 'reply' => 'ตอบกลับ');

echo 'ข้อความที่ 1 สถานะ = '. $status1 . ' >> '. $statusText[$status1];
echo 'ข้อความที่ 2 สถานะ = '. $status2 . ' >> '. $statusText[$status2];
echo 'ข้อความที่ 3 สถานะ = '. $status3 . ' >> '. $statusText[$status3];
<br>

?>
ผลลัพธ์ที่ได้ จะเป็นการเช็กสถานะข้อความ
ลองเปรียบเทียบตัวแปรปกติ กับตัวแปรอาร์เรย์กับกล่องเก็บของใบหนึ่ง
ถ้ากำหนดให้กล่อง ใบ บรรจุของได้เพียงชิ้นเดียว ตัวแปร $box ก็จะเก็บได้แค่หนังสือเล่มเดียว หรือของเล่นชิ้นเดียว หรืออะไรก็แล้วแต่ได้เพียงชิ้นเดียวเท่านั้น ไม่สามารถเก็บของที่เกลื่อนกลาดดาษเดื่อนบนพื้นห้องที่แสนรกรุงรังได้หมด  
วิธีการแก้ปัญหานี้สามารถทำได้โดยการนำกล่องหลายๆกล่องมาวางเรียงกัน ก็จะสามารถเก็บของชิ้นที่เหลือได้ทั้งหมด เหลือของกี่ชิ้นก็นำกล่องมาเพิ่มตามจำนวน เช่น
<?php
$box[0] = “Book”;
$box[1] = “Clock”;
$box[2] = “Gundum”;
$box[3] = “Pen”;
$box[4] = “Cap”;
?>
ประกาศตัวแปรอาร์เรย์แบบสั้นๆ ได้ดังนี้
<?php
$box = array(“Book”, “Clock”, “Gundum”, “Pen”, “Cap”);
?>
สำหรับตัวแปร Array นั้นเราไม่สามารถแสดงข้อมูลออกมาด้วยคำสั่ง echo แบบปกติได้ เพราะข้อมูลถูกเก็บไว้ในตำแหน่งต่างๆ ที่ไม่สามารถนำมาแสดงได้ ก็ต้องใช้การวนลูปเลือกมาแสดงทีละลำดับโดยเริ่มจากกล่องแรกที่จะอยู่ในตำแหน่ง เสมอ ในที่นี้ก็คือ Book นั่นเอง สำหรับตัวอย่างการวนแสดงผลทีละรอบนั้น ดูได้จากตัวอย่าง PHP กับการทำซ้ำ

PHP คืออะไร

พีเอชพี (PHP) คือ ภาษาคอมพิวเตอร์ในลักษณะเซิร์ฟเวอร์-ไซด์ สคริปต์ โดยลิขสิทธิ์อยู่ในลักษณะโอเพนซอร์ส ภาษาพีเอชพีใช้สำหรับจัดทำเว็บไซต์ และแสดงผลออกมาในรูปแบบ HTML โดยมีรากฐานโครงสร้างคำสั่งมาจากภาษา ภาษาซี ภาษาจาวา และภาษาเพิร์ล ซึ่ง ภาษาพีเอชพี นั้นง่ายต่อการเรียนรู้ ซึ่งเป้าหมายหลักของภาษานี้ คือให้นักพัฒนาเว็บไซต์สามารถเขียน เว็บเพจ ที่มีความตอบโต้ได้อย่างรวดเร็ว

จะให้เข้าใจง่ายๆ ก็คือเครื่องมือที่ใช้สำหรับเขียนโปรแกรมติดต่อกับฐานข้อมูล เพื่อนำไปแสดงผลบนอินเตอร์เน็ตตามความต้องการของผู้ใช้งานที่คลิกเข้าไปนั่น เอง

การเขียนโปรแกรมจะมีอยู่ 2 แบบครับ (ส่วนของ MOBILE APP จะขอไม่กล่าวถึงนะครับ ^^")
  1. Windows based Application (Desktop Application)
  2. Web based  Apllication

จะมีข้อแตกต่างอย่างเห็นได้ชัดอย่างหนึ่งคือ การเรียกใช้ทรัพยากรของเครื่องต่างกัน

1. Windows based คือโปรแกรมที่ต้องติดตั้งกับเครื่องของผู้ใช้แต่ละคนแต่ละเครื่องโดยที่อาจ จะใช้ฐานข้อมูลเซิร์ฟเวอร์เดียวกัน หรือฐานข้อมูลเครื่องใครเครื่องมันก็แล้วแต่วัตถุประสงค์ของโปรแกรมนั้นๆ หากเป็นกรณีที่ใช้ฐานข้อมูลร่วมกันจะมีการเก็บข้อมูลไว้ที่เซิร์ฟเวอร์ แต่โปรแกรมที่ใช้งานจะอยู่ที่เครื่องใครเครื่องมัน ดังนั้นสเปกคอมพิวเตอร์ที่ใช้จะต้องใกล้เคียงกันตามข้อกำหนดของโปรแกรมนั้นๆ

2. Web based คือโปรแกรมที่ทำงานบนเว็บเซิร์ฟเวอร์โดยรันผ่านโปรแกรมเว็บบราวเซอร์ทั่วไป เช่น Internet Explorer, Mozilla Firefox, Google Chrome, Opera, Safari ฯลฯ ไม่ต้องติดตั้งโปรแกรมหรือสคริปต์ที่พัฒนาขึ้นในแต่ละเครื่อง เพราะจะเรียกใช้งานผ่านเซิร์ฟเวอร์ด้วยเว็บเบราเซอร์ต่างๆ เหมาะสำหรับระบบจัดการข้อมูล และรายงานต่างๆ แต่ไม่เหมาะกับการควบคุมฮาร์ดแวร์เช่นลิ้นชักเก็บเงิน หรือฮาร์ดแวร์อื่นๆ ที่ระบบ Windows based สามารถสั่งงานได้

ดูจากข้อมูลแล้วแน่นอนว่า PHP ต้องอยู่ในหมวดการเขียนโปรแกรมแบบ Web based เพราะเราจะเก็บสคริปต์ทั้งหมดที่เขียนขึ้นมาไว้ที่เซิร์ฟเวอร์ที่เดียว และให้ผู้ใช้งานเรียกข้อมูลผ่านเว็บเบราเซอร์ต่างๆ มาแสดงผลที่หน้าจอนั่นเอง

ถ้ายังสงสัยว่า PHP คืออะไร? 

เรามาลองพูดถึงเรื่องของการสร้างเว็บไซต์ที่มีระบบจัดการเนื้อหา หรือส่วนของผู้ดูแลเว็บไซต์ที่จัดการได้ผ่านทางหน้าเว็บเองได้เลยนั้น หลายท่านคงจะนึกถึง Joomla, Wordpress, OpenCart, Drupal, SMF, phpBBและอีกหลายตัวที่มีจุดแข็งแตกต่างกันไป 

ท่านทราบหรือไม่ว่า CMS ดังๆเหล่านี้สร้างด้วยภาษา PHP ทั้งหมด และข้อมูลที่มีการเพิ่มเข้าไปนั้นจะถูกเก็บเป็นไฟล์ และส่วนหนึ่งก็อยู่ในรูปแบบของฐานข้อมูลซึ่งโดยปกติแล้วก็จะใช้ฐานข้อมูล MySQL ที่คุ้นเคยกันมานาน

ดังนั้นภาษา PHP ก็สรุปได้ว่าเป็นภาษาที่ใช้สำหรับสร้างเว็บไซต์ที่มีระบบฐานข้อมูล หรือมีการเปลี่ยนแปลงข้อมูลในเว็บไซต์อย่างสม่ำเสมอ เพื่อให้ระบบบริหารจัดการเว็บไซต์ง่ายขึ้นด้วยการเขียนโปรแกรมจัดการไฟล์ และฐานข้อมูลด้วย PHP นั่นเองครับ



ส่วนของข้อดีข้อเสียนั้น ผมจะขอข้ามไปเลยละกันเพราะโปรแกรมแต่ละภาษาถ้าใช้ให้เหมาะกับงานก็นับว่ามี ข้อดีเยอะกว่าข้อเสีย อันนี้แล้วแต่จะพิจารณาไป แต่จะขอบอกถึงข้อแตกต่างที่เห็นได้ชัดของการเขียนโปรแกรม 2 ประเภทนี้ดังนี้

1. PHP เก็บโปรแกรมหรือคำสั่งทั้งหมดไว้ที่เซิร์ฟเวอร์ ดังนั้นเมื่อเปลี่ยนเวอร์ชั่น ผู้ใช้งานแต่ละเครื่องไม่จำเป็นต้องอัพเดตโปรแกรมตาม (เพราะไม่ได้ติดตั้งโปรแกรม) หากแต่ว่าเวอร์ชั่นที่เปลี่ยนแปลงไปหมายถึงการแสดงผลที่เลิศหรูอลังการงาน สร้าง ด้วยสุดยอดเอฟเฟกต์ของเว็บเบราเซอร์รุ่นใหม่ๆล่ะก็ อันนี้ผู้ใช้งานก็ต้องอัพเดตโปรแกรมเว็บเบราเซอร์เพื่อใช้เรียกดูข้อมูลตาม ไปด้วยครับ

2. PHP ไม่ต้องติดตั้งโปรแกรมหรือคำสั่งไว้บนเครื่องผู้ใช้งานดังนั้นก็ประหยัด ฮาร์ดดิสก์ประหยัดแรมนิดหน่อย แต่ก็ไม่ได้หมายความว่าไม่ใช้แรมนะครับ เพราะว่าโปรแกรมเว็บเบราเซอร์จะเป็นตัวช่วยเขมือบแรมให้เอง แต่อย่างน้อยก็ช่วยเรื่องสเปกคอมพิวเตอร์ที่ไม่ต้องกำหนดตายตัวตามโปรแกรม ที่พัฒนาขึ้น ขอแค่เพียงมีคอมพิวเตอร์ที่ใช้งานเว็บเบราเซอร์เพื่อเปิดดูข้อมูลจาก เซิร์ฟเวอร์ได้ก็พอ

3. PHP ไม่ต้องเสียค่าลิขสิทธิ์ให้กับชุดพัฒนาซอฟต์แวร์ เพราะซอฟต์แวร์ที่ใช้ในการพัฒนาทั้งหมดเป็นแบบโอเพ่นซอร์ส (Open source)

4. PHP พัฒนาแอพพลิเคชั่นที่สามารถเรียกใช้งานได้หลายระบบปฏิบัติการ หรือ ข้ามแพลตฟอร์ม (Cross-platform) ไม่ว่าจะใช้ Windows, Linux, Ubuntu ก็สามารถเข้าใ้ช้งานได้ หรือแม้กระทั่งบนอุปกรณ์เคลื่อนที่ต่างๆ เพียงแต่ปรับแต่งเรื่องการแสดงผลเพิ่มเติมเท่านั้น

PHP กับการกำหนดตัวแปร และชนิดของข้อมูล


  • ทำไมต้องมีตัวแปร ให้วุ่นวาย?
    : เพราะมีค่าบางค่าที่ไม่แน่นอน เป็นค่าที่ไม่ตายตัวจะแสดงผลตามที่ผู้ใช้เลือก หรือป้อนเข้ามาเช่นหน้าเว็บแสดงข้อมูลบุคคล เขียนหน้าเดียวแต่จะแสดงข้อมูลของหลายๆคนได้ ด้วยการเลือกแสดงผลจากตัวแปรที่ส่งมาที่หน้าเว็บในแต่ละครั้ง
  • ตัวอย่างการใช้ตัวแปร จะใช้ในโอกาสใดบ้าง
    :  แสดงข้อมูลบุคคลตามที่เลือก เช่นดูข้อมูลนาย A, B, C เป็นต้น การใช้เก็บค่าที่ต้องการแสดงผลออกมาก่อนโดยมีการตรวจสอบเงื่อนไขว่าควรแสดง ข้อมูลไหน แล้วสั่งแสดงผลทีเดียวไม่ต้องสั่งแสดงผลทุกครั้งที่ตรวจสอบ
  • ตั้งชื่อตัวแปรอย่างไรให้มาดูโค๊ดทีหลังแล้วเข้าใจง่าย
    : ตั้งชื่อให้สื่อความหมายและไม่ยาวเกินไป อาจจะใช้ตัวย่อในการตั้งชื่อ เช่น ตัวแปรที่เก็บชื่อของนักเรียนก็ใช้ $student ถ้าจะใช้คำย่อเช่นนักเรียนชาย ก็ใช้ว่า $stdMan, นักเรียนหญิง $stdWoman หรือ $std_man, $std_woman ก็ได้แล้วแต่ชอบ หรือจะใส่คำเต็มๆไปไม่ย่อก็แล้วแต่สะดวกครับ
  • การแสดงผลค่าที่เก็บไว้ในตัวแปร
    : PHP มีคำสั่งที่ใช้แสดงผลอยู่หลายคำสั่งครับ แต่นิยมใช้กันก็คือ echo เช่น echo “สวัสดีครับ”;
    $name = “Songchai”;
    echo “สวัสดีครับ คุณ “. $name;
  • เปรียบเทียบวิธีการแสดงผล แบบใช้เครื่องหมายจุด(.) และ จุลภาค(,)
    การแสดงผลนั้น สามารถใช้วิธีการแสดงข้อความได้ 2 แบบคือแบบใช้จุดเชื่อมต่อข้อความ และใช้คอมม่าในการเชื่อมคำสั่งแสดงผล
    1. echo “สวัสดีครับ คุณ “. $name;
    1. echo “สวัสดีครับ คุณ “, $name;

    ในหลักการเพิ่มความเร็วให้กับโค๊ดที่เขียนนั้น ส่วนใหญ่แนะนำให้ใช้แบบที่ 2 แต่ก็มีหลายกรณีที่เราจะต้องรวมตัวแปรก่อนแล้วค่อยแสดงผลทีหลัง ซึ่งอาจจะต้องใช้ผสมกันไปตามความเหมาะสม
    เช่น 
1. $name = “Songchai “; $surname = “Saetern”; $fullname = $name.” “.$surname

2. //ไม่สามารถใช้ $fullname = $name, ” “, $surname ได้เพราะใช้ได้เฉพาะตอนแสดงผลเท่านั้น

3. echo “สวัสดีครับ คุณ “$fullname;

วันอาทิตย์ที่ 2 พฤศจิกายน พ.ศ. 2557

รูปแบบบรรทัดฐาน

แนวคิดในการทำรีเลชั่นให้อยู่ในรูปแบบบรรทัดฐานถูกคิดค้นโดย อี.เอฟ.คอดด์เป็นกระบวนการที่นำเค้าร่างของรีเลชั่นมาทำให้อยู่ในรูปแบบบรรทัดฐาน(normal from)

วัตถุประสงค์ของการทำให้เป็นบรรทัดฐาน มีดังนี้
  1. เพื่อลดเนื้อที่ในการเก็บข้อมูลการทำให้เป็นบรรทัดฐานเป็นการลดความซ้ำซ้อนของข้อมูลในรีเลชั่น
  2. เพื่อลดปัญหาที่ข้อมูลไม่ถูกต้อง(Inconsistency)เนื่องจากข้อมูลในรีเลชั่นหนึ่งจะมีข้อมูลไม่ซ้ำกัน เมื่อมีการปรับปรุงข้อมูลก็จะปรับปรุงทูเพิลนั้นๆครั้งเดียวไม่ต้องปรับปรุงหลายแห่ง
  3. เป็นการลดปัญหาที่เกิดจากการเพิ่ม ปรับปรุงและลบข้อมูล

รูปแบบบรรทัดฐาน (Normal Form)
รูปแบบบรรทัดฐานทีใช้ในการกำหนดแอททริบิวต์ที่เหมาะสม ในรีเลชั่นแบ่งออกเป็นดังนี้

รูปแบบบรรทัดฐานขั้นที่ 1
รีเลชั่นหนึ่งๆจะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 1 ก็ต่อเมื่อ "ค่าของแอททริบิวต์หนึ่งในแต่ละทูเพิลจะมีค่าของข้อมูลเพียงค่าเดียวหากรีเลชั่นใดไม่มีคุณสมบัติดังกล่าวข้างต้นจะต้องทำการปรับปรุงให้อยู่ในรูปแบบบรรทัดฐานขั้นที่หนึ่งโดยการแยกกลุ่มข้อมูลที่ซ้ำกันเป็นรีเลชั่นใหม่และกำหนดให้เป็นแอททริบิวต์ที่เป็นตัวกำหนดค่าของกลุ่มข้อมูลที่ซ้ำกันนี้( Multivalued Attribute) เป็นคีย์หลักของรีเลชั่นใหม่"

Relation A
sno
sname
city
pno
qty
S1SeriBangkokP1 P2 P3 P4200 400 200 300
S2WandaRayongP1 P2400 300
S3SomhaiRayongP2200
S4
Orapan
Bangkok
P2
200
สมมุติให้รีเลชั่น A เป็นรีเลชั่นที่ประกอบด้วยAttribute ของ entity ผู้ผลิต และ entity การส่งของ โดยจะเห็นว่าในรีเลชั่น จะมีรหัสของผู้ผลิต s1,s2,s3,s4 และมีรหัสสินค้าหลายค่า วิธีแก้ไขปัญหานี้คือ การไส่ข้อมูลของ s1,s2,s3,s4 ลงไปในทุก รหัสสินค้า โดยผลการใส่ข้อมูลดังกล่าวนี้จะทำให้รหัสผู้ผลิต (sno) ไม่ใช่คีย์หลัก แต่คีย์หลักจะประกอบด้วยรหัสผู้ผลิตและ รหัสสินค้า (sno,pno)
Relation A
snosnamecitypnoqty
S1SeriBangkokP1300
S1SeriBangkokP2200
S1SeriBangkokP3400
S1SeriBangkokP4200
S2WandaRayongP1300
S2WandaRayongP2400
S3SomchaiRayongP2200
S4OrapanBangkokP2200
อย่างไรก็ตาม อาจมีความผิดพลาดบางอย่างที่อาจเกิดขึ้นกับ ข้อมูลนี้อยู่ เช่น
  1. ความผิดพลาดที่เกิดจากการเพิ่มข้อมูล (Insert Anomaly) จากรีเลชั่นนี้ จะเห็นว่าการที่เพิ่มข้อมูลของผู้ผลิตจะทำได้ต่อเมื่อผู้ผลิตรายนั้นได้มีการส่งสินค้าไปให้ผู้ซื้อรีเลชั่น แต่จะไม่ แสดงรายละเอียดของสินค้าของสินค้าผู้ผลิต s5 ที่อยู่ จ. เลย ถ้าไม่มีการส่งสินค้า ปัญหาคือ การกำหนด attribute ที่เป็นคีย์หลักของรีเลชั่นนี้ เป็นการกำหนดที่ไม่เหมาะสม จากกฏความบูรณภาพของเอนทิตี้ (The Entity Integrity Rule)โดยที่รหัสสินค้า(pno)จะเป็นค่าว่าง หากมีเพียงข้อมูลของผู้ผลิตแต่ไม่เคยสั่งสินค้า
  2. ความผิดพลาดที่เกิดจากการลบข้อมูล (Delete Anomaly) ในการลบข้อมูลบางทูเพิลทิ้งไปจะลบทั้งข้อมูลผู้ผลิตและข้อมูล การส่งสินค้า เช่นการลบข้อมูลทูเพิลรหัสผู้ผลิต s3 และรหัสสินค้า p2 จะทำให้ข้อมูลของผู้ผลิต s3 หายจากฐานข้อมูล ปัญหาของรีเลชั่นนี้คือ รีเลชั่นนี้ประกอบด้วย attribute ที่เกินเงื่อนไขในการใช้งาน ( มี attribute มากเกินไปโดยที่ข้อมูลของบาง attribute อาจไม่จำเป็นใช้งานแต่มาผูกติดกับ attrbute ที่ต้องการใช้งาน )
  3. ความผิดพลาดที่เกิดจากการปรับปรุงข้อมูล(Update Anomaly) การปรับปรุงข้อมูลของรีเลชั่น จะทำให้เกิดความความยุ่งยากและเสียเวลา  รวมถึงอาจก่อให้เกิดความผิดพลาดที่ข้อมูลไม่เหมือนกัน เช่น การปรับปรุงข้อมูลใน s1 โดยเปลื่ยนชื่อจังหวัดจาก Bangkok เป็น Ayudtaya ซึ่งการปรับเปลื่ยนข้อมูลนี้ จะต้องค้นหารหัสผู้ผลิต s1 ทุกทูเพิลมาปรับปรุง ทำให้เสียเวลาและอาจเกิดความผิดพลาดที่ผู้ผลิตรหัส S1 บางทูเพิลไม่ได้ถูกเปลื่ยนเป็นชื่อจังหวัดใหม่ปัญหาที่เกิดขึ้นของรีเลชั่น สามารถแก้ไขโดยการแตกรีเลชั่น(Decomposition) ออกเป็น 2 รีเลชั่น คือ  Supplier,OrderSupplier ประกอบด้วย Attribute Sno,Sname,City โดยมี Attribute Sno เป็น Primary keyOrder ประกอบด้วย Attribute Sno,Pno,City โดยมี Attribute SnoและPno  เป็น Primary key ร่วมกัน
รูปแบบบรรทัดฐานขั้นที่ 2 
รีเลชั่นหนึ่งๆ จะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 2 ก็ต่อเมื่อ "รีเลชั่นนั้นๆอยู่ในรูปแบบบรรทัดฐานขั้นที่ 1 และมีคุณสมบัติอีกประการหนึ่งคือแอทริบิวต์ทุกแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักจะต้องมีความสัมพันธ์ระหว่างค่าของแอทริบิวต์แบบฟังก์ชั่นกับคีย์หลัก(Fully Functional Dependency) กล่าวอีกนัยหนึ่งคือค่าของแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักจะสามารถระบุค่า โดยแอททริบิวต์ที่เป็นคีย์หลัก แอททริบิวต์ทั้งหมดที่ประกอบกันเป็นคีย์หลัก" ในกรณีที่คีย์หลักเป็นคีย์ผสม จากรีเลชั่น Supplier และ Order รีเลชั่นทั้งสองอยู่ในรูปแบบบรรทัดฐานขั้นที่ 2 แล้ว ในรีเลชั่น Supplier มีรหัสผู้ผลิตเป็นคีย์หลัก เช่น เมื่อทราบค่า รหัสผู้ผลิต S1 ก็จะสามารถทราบค่าของชื่อและจังหวัดของผู้ผลิตคือ Seri อยู่ที่จังหวัด Bangkok หรือในรีเลชั่น Order  จำนวนการส่งสินค้า (QTY) จะถูกระบุโดยรหัสผู้ผลิตและรหัสสินค้า ดังนั้น ค่าของแอททริบิวต์อื่นๆที่ไม่ได้เป็นคีย์หลักของรีเลชั่น Supplier และ Order สามารถระบุโดยค่าของแอททริบิวต์ที่เป็นคีย์หลัก

รูปแบบบรรทัดฐานขั้นที่ 3
รีเลชั่นหนึ่งๆจะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 3 (3NF)  ก็ต่อเมื่อ “รีเลชั่นนั้นๆอยู่ในรูปแบบบรรทัดฐานขั้นที่ 2 ละมีคุณสมบัติอีกประการหนึ่งคือแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักไม่มีคุณสมบัติในการกำหนดค่าของแอททริบิวต์อื่นที่ไม่ใช่คีย์หลัก” จากรูปรีเลชั่น Supplier 1 จะคล้ายคลึงกับรีเลชั่น Supplier ที่เคยกล่าวมาข้างต้นเพียงแต่เพิ่มแอททริบิวต์ Rating เข้าไปรีเลชั่นนี้มีรหัสผู้ผลิตเป็นคีย์หลัก  
SNAMESUPPLIER 1 
SNO
SNAME
CITY 
RATING
S1
SERI 
BANGKOK 
2
S2
WANIDA
RAYONG
3
S3
SOMCHAI
RAYONG 
3
S4
ORAPIN
BANGKOK
2
S5
TANACHOTE 
PATUMTANE
1
หากพิจารณาดูแล้วจะเห็นว่ารีเลชั่น Supplier 1 นี้ อยู่ในรูปแบบบรรทัดฐานขั้นที่ 2 แล้ว คือ ไม่มีค่าของข้อมูลซ้ำกันและขณะเดียวกัน ค่าของแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักอื่นๆสามารถระบุค่าได้โดยค่าของแอททริบิวต์ที่เป็นคีย์หลัก เช่นถ้าทราบว่ารหัสผู้ผลิตคือ SI จะสามารถทราบเลยว่า ผู้ผลิตนั้นๆชื่ออะไร อยู่ที่จังหวัดใดและอยู่ในจังหวัดที่ถูกจัดอันดับไว้เป็นอันดับเท่าไร รีเลชั่นนี้ไม่มีคีย์คู่แข่ง เพราะว่าไม่มีคีย์อื่นที่มีคุณสมบัติเป็นคีย์หลักได้เช่นเดียวกับรหัสผู้ผลิต ถึงแม้ว่าชื่อจังหวัดสามารถจะระบุการจัดอันดับของผู้ผลิต แต่ไม่สามารถระบุชื่อของผู้ผลิตได้ชัดเจนเช่นในกรณีของชื่อจังหวัดที่อยู่กรุงเทพชื่อของผู้ผลิตอาจเป็นSeri หรือ Orapin ก็ได้ ซึ่งไม่สามารถกำหนดชัดเจนว่าชื่ออะไร แอททริบิวต์ City จึงไม่มีคุณสมบัติเป็นคีย์หลักหรือคีย์คู่แข่งนอกจากนี้จะพบว่ามีความสัมพันธ์ระหว่างแอททริบิวต์ที่ไม่ได้เป็นคีย์หลักอยู่ นั่นคือ แอททริบิวต์ชื่อจังหวัด (City) และแอททริบิวต์การจัดอันดับของผู้ผลิต(Rating ) โดยแอททริบิวต์ชื่อจังหวัดสามารถระบุค่าการจัดอันดับความสะดวกในการขนส่งสินค้า ซึ่งเป็นความสัมพันธ์ระหว่างค่าของแอททริบิวต์แบบทรานซิทีฟ (TransitiveDependency)หากรีเลชั่นใดมีคุณสมบัติดังกล่าว จะก่อให้เกิดความผิดพลาดที่เกิดจากการเพิ่ม หรือลบหรือปรับปรุงข้อมูลได้ เช่นก. ความผิดพลาดที่เกิดจากการปรับปรุงข้อมูล (Update Anomaly) หากมีการแก้ไขการจัดอันดับของจังหวัดของจังหวัดของผู้ผลิตเนื่องจากความสะดวกในการขนส่งที่เปลี่ยนแปลงไป จะต้องทำการแก้ไขข้อมูลหลายทูเพิล ซึ่งอาจจะเกิดปัญหาการแก้ไขไม่ครบถ้วน อันจะก่อให้เกิดความไม่ตรงกันของข้อมูลได้ข. ความผิดพลาดที่เกิดจากการลบข้อมูล (Delete Anomaly)หากมีการลบข้อมูลการจัดอันดับของจังหวัดของผู้ผลิต จะทำให้ข้อมูลการจัดอันดับของจังหวัดนั้นหายไปจากฐานข้อมูลเช่น หากลบทูเพิลของรหัสผู้ผลิต S5 จะไม่มีข้อมูลของผู้ผลิตที่อยู่ที่จังหวัดปทุมธานีว่าถูกจัดอันดับอยู่ที่อันดับที่เท่าไร ด้วยเหตุผลที่แอททริบิวต์ชื่อจังหวัดไม่มีคุณสมบัติเป็นคีย์หลักในรีเลชั่น Supplier 1 แต่สามารถกำหนดค่าของแอททริบิวต์การจัดอันดับได้ ซึ่งอาจก่อให้เกิดปัญหาความผิดพลาดจากการเพิ่ม ปรับปรุงหรือลบข้อมูลการขจัดปัญหาดังกล่าวจะทำได้โดยการ แตกรีเลชั่น Supplier1เป็นสองรีเลชั่น (Decomposition) โดยแยกแอททริบิวต์ที่ถูกกำหนดค่ากับแอททริบิวต์ที่เป็นตัวกำหนดค่า(Determinant)ออกเป็นรีเลชั่นใหม่ และกำหนดให้แอททริบิวต์ที่เป็นตัวกำหนดค่า (Determinant) เป็นคีย์หลักของรีเลชั่นใหม่ดังนี้ SUPPLIER (SNO,SNAME,CITY) CITY(CITY,RATING)รีเลชั่น Supplier ประกอบด้วยแอททริบิวต์ (SNO,SNAME,CITY) มี SNO เป็นคีย์หลักโดยมี CITY เป็นคีย์นอกที่อ้างอิงถึงแอททริบิวต์ CITY  ที่อยู่ในรีเลชั่น CITY ประกอบด้วยแอททริบิวต์(City,Rating) และมี City เป็นคีย์หลัก วิธีการแตกรีเลชั่น(Decomposition) ที่กล่าวมาข้างต้นจะต้องทำตามขั้นตอนดังนี้คือ ประการแรก ให้นำแอททริบิวต์ทึ่ถูกกำหนดค่ากับแอททริบิวต์ที่เป็นตัว กำหนดค่าแยกออกเป็นรีเลชั่นใหม่และ ประการที่สองคือกำหนดให้แอททริบิวต์ที่เป็นตัวกำหนดค่าเป็นคีย์หลักของรีเลชั่นใหม่นั้นอย่างไรก็ตามในบางครั้งผู้ออกแบบเค้าร่างของฐานข้อมูลพยายามแตกรีเลชั่นที่มีแอททริบิวต์มากๆออกเป็นหลายรีเลชั่นโดยไม่ได้ปฎิบัติตามวิธีการที่กล่าวมาแล้วข้างต้นซึ่งจะทำให้เกิดปัญหาการแตกฐานข้อมูลที่ไม่เหมาะสมได้(Bad Decomposition) ตัวอย่างเช่น หากแตกรีเลชั่นของ Supplier 1 เป็นดังนี้  รีเลชั่น Supplier (SNO SNAME CITY) มีSNO เป็นคีย์หลัก รีเลชั่น Supplier 2 (SNO,RATING) มี SNOเป็นคีย์หลัก
SUPPLIER
SNO
SNAME
  CITY
S1SERI BANGKOK
S2WANIDARAYONG
S3SOMCHAIRAYONG
S4ORAPIN BANGKOK
S5TANACHOTE PATUMTANE

SUPPLIER2 
SNO
SNAME
S1
 2
S2
3
S3
3
S4
2
S5
 1
จากรูป การแตกรีเลชั่นจากตัวอย่างนี้ดูเหมือนจะแก้ปัญหาความผิดพลาดที่อาจจะเกิดขึ้นจากการเพิ่ม ลบ หรือปรับปรุงข้อมูลได้ เพราะได้แตกรีเลชั่นออกเป็นสองรีเลชั่น และอยู่ในรูปแบบบรรทัดฐานขั้นที่ 3 แล้ว แต่การแตกรีเลชั่นทั้งสองข้อที่จะก่อให้เกิดความผิดพลาดขึ้นได้อีกเช่นกัน จากตัวอย่างนี้จะเห็นว่าการเพิ่มชื่อจังหวัดและการจัดอันดับของจังหวัดใหม่จะทำไม่ได้จนกว่าจะมีผู้ผลิตรายใดอยู่ที่จังหวัดที่จะเพิ่มชื่อและจัดอันดับนั้นรีเลชั่น Supplier และรีเลชั่น Supplier 2 เป็นรีเลชั่นที่ไม่มีความเป็นอิสระจากกัน ทั้งนี้เพราะจังหวัดเป็นตัวกำหนดการจัดอันดับ

รูปแบบบรรทัดฐานขั้นที่ 4 
รีเลชั่นนี้จะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 4 ก็ต่อเมื่อ "รีเลชั่นนั้นๆ อยู่ในรูปแบบ BCNF และเป็นรีเลชั่นที่ไม่มีความสัมพันธ์ในการระบุค่าของแอททริบิวต์แบบหลายค่า"  โดยที่ แอททริบิวต์ที่ถูกระบุค่าหลายค่าเหล่านี้ไม่มีความสัมพันธ์กัน (Independently Multivalued Dependency) รีเลชั่นที่ต้องผ่านการทำให้อยู่ในรูปแบบบรรทัดฐานขั้นที่4นี้จะต้องมีแอททริบิวต์อย่างน้อยสามแอททริบิวต์ จากรูป เป็นรีเลชั่นที่ประกอบด้วยแอททริบิวต์รหัสผู้ผลิต (Sno) รหัสโครงการที่สั่งผลิต (Pjno) และชื่อจัหวัดที่โรงงานของผู้ผลิต ตั้งอยู่  (City) โดยกำหนดให้ผู้ผลิตหนึ่งผลิตให้หลายโครงการ และผู้ผลิตหนึ่งๆ มีโรงงานตั้งอยู่ที่หลายจังหวัด (City)
Sno
Pjno
City
S1Pj01 Pj02Bangkok Samuthprakarn
S2Pj03 Pj04  Pj05Rayong Chonbure
ทำให้อยู่ในรูปแบบบรรทัดฐาน BCNF โดยให้ทุกแอททริบิวต์ ประกอบกันเป็นคีย์หลัก
SPJC 
  Sno
Pjno
City
S1
Pj01
Bangkok
S1
Pj01
Samuthprakarn
S1
Pj02
Bangkok
S1
Pj02
Samuthprakarn
S2
Pj03
Rayong
S2
Pj05
Chonbure
S2
Pj04
Rayong
S2
Pj04
Chonbure
S2
Pj05
Rayong
S2
Pj05
Chonbure
รีเลชั่น SPJC ประกอบด้วยแอททริบิวต์รหัสผู้ผลิต (Sno) ซึ่งมีความ สัมพันธ์ ในการระบุค่าแอททริบิวต์รหัสโครงการที่สั่งผลิต(Pjno) และแอททริบิวต์จังหวัดที่โรงงานของผู้ผลิตตั้งอยู่ (City) ได้หลายค่า รีเลชั่น SPJC อยู่ในรูปแบบ BCNF เมื่อมีแอททริบิวต์ทุกแอททริบิวต์ เป็นคีย์ นอกจากนี้ รหัสผู้ผลิต (SNO) มีความสัมพันธ์ในการระบุค่า ของรหัสโครงการที่สั่งผลิต (PJNO) แบบหลายค่า (SNO->-> PJNO) ในขณะเดียวกัน รหัสผู้ผลิต (SNO) ก็มีความสัมพันธ์ในการระบุค่า แบบหลายค่ากับชื่อจังหวัดที่ผู้ผลิตตั้งอยู่ (CITY) การที่แอททริบิวต์ ทั้งสองไม่มีความสัมพันธ์กันแต่มาอยู่ในรีเลชั่นเดียวกัน  จะก่อให้เกิด ความซ้ำซ้อนของข้อมูลเกิดขึ้น เพราะค่าของชื่อจังหวัดจะต้องปรากฏ ในรีเลชั่นซ้ำกันเพื่อให้ข้อมูลในแต่ละทูเพิลมีข้อมูลครบถ้วนถึงแม้ว่ารีเลชั่น SPJC จะอยู่ในรูปแบบของBCNFโดยมีแอททริบิวต์ทุกแอททริบิวต์ประกอบกันเป็นคีย์หลักก็ตาม  รีเลชั่นนี้ก็ยังมีปัญหาแฝงอยู่เช่นกัน  ปัญหาความผิดพลาดที่เกิดจากการเพิ่ม ลบ หรือปรับปรุงข้อมูล มีโอกาสที่เกิดขึ้นมากมาย เช่น หากผู้ผลิตรหัส S2 ย้ายโรงงานRAYONG ไปอยู่จังหวัดอื่น ก็ต้องทำการแก้ไขข้อมูลหลายทูเพิล หรือความผิดพลาดในการเพิ่มข้อมูล อาจทำไม่ได้เช่นการเก็บข้อมูลที่จังหวัด ที่ตั้งของผู้ผลิตคนใหม่  ที่ยังไม่เคยได้รับงานโครงการใด ก็จะทำไม่ได้ เป็นต้น  สามารถแก้ปัญหารีเลชั่น โดยแบ่งออกเป็น 2 รีเลชั่นคือ  รีเลชั่น SPJ ประกอบด้วย แอททริบิวต์ SNO และ PJNO และมีแอททริบิวต์ทั้งสอง ประกอบกันเป็นคีย์หลักดังนี้
SPJ 
SNO
PJNO
S1
PJ01
S1
PJ02
S2
PJ03
S2
PJ04
S2
PJ05
รีเลชั่น SC ประกอบด้วยแอททริบิวต์ SNO และ CITY และมีแอททริบิวต์ทั้งสองประกอบกันเป็นคีย์หลัก  ดังนี้

SC 
SNO
CITY
S1
BANGKOK
S1
SAMUTHPRAKARN
S2
RAYONG
S2
CHONBURI

รูปแบบบรรทัดฐานขั้นที่ 5 
รีเลชั่นหนึ่ง ๆ จะอยู่ในรูปแบบบรรทัดฐานขึ้นที่ 5 หรือเรียกว่า Project-JoinNormal Form (PJ/NF) ก็ต่อเมื่อ "รีเลชั่นนั้นอยู่ในรูปแบบบรรทัดฐานขึ้นที่ 4 และเป็นรีเลชั่นที่มีคีย์หลักเป็นคีย์ผสมที่ประกอบด้วยแอททริบิวต์ตั้งแต่ 3 แอททริบิวต์เป็นต้นไป  หากมีการแตกรีเลชั่นออกเป็นรีเลชั่นย่อย 3 รีเลชั่น (หรือมากกว่า) (Projection) ซึ่งเกิดจากการจับคู่แอททริบิวต์แต่ละคู่ของรีเลชั่น  เดิมเป็นคีย์ผสมและเมื่อทำการเชื่อมโยงรีเลชั่นย่อยทั้งหมด (Join) จะไม่ก่อให้เกิดข้อมูลใหม่ที่ไม่เหมือนรีเลชั่นเดิม" จากรูป รีเลชั่น SPP ประกอบด้วยแอททริบิวต์ชื่อผู้ผลิต (SNAME)  ชื่อสินค้า (PNAME) และชื่อโครงการ (PJNAME)โดยมีแอททริบิวต์ทั้ง 3 เป็นคีย์หลัก
 RELATION SPP
SNAMEPNAMEPJNAME
SERI 
PEN
PROJ2
SERI
TABLE
PROJ1
WANIDA
PEN
PROJ1
SERI
PEN
PROJ1
รีเลชั่น SPP จะอยู่ในรูปแบบบรรทัดฐานขั้นที่ 4 แต่ก็ประสบปัญหาในการปรับปรุงแก้ไขข้อมูล เช่น การลบข้อมูล ของทูเพิลที่ 3 ข้อมูลของชื่อผู้ผลิต ชื่อ WANIDA ก็จะหายไปจากฐานข้อมูลหรือหากมีการเปลี่ยนชื่อสินค้าใด สินค้าหนึ่ง ก็จะต้องทำการปรับปรุงหลายทูเพิล
เพื่อหลีกเลี่ยงปัญหาดังกล่าว จึงทำการแตกรีเลชั่น SPP เป็น 3 รีเลชั่นย่อย (Projection) โดยในแต่ละรีเลชั่นย่อย  จะประกอบด้วยแอททริบิวต์แต่ละคู่เป็นคีย์ผสมของรีเลชั่นย่อย ดังรูป
รีเลชั่น 1 : SP
SNAME PNAME
 SERIPEN
 SERITABLE
WANIDAPEN

รีเลชั่น 2 : PPJ 
PNAMEPJNAME
PENPROJ2
TABLEPROJ1
PENPROJ1
  
รีเลชั่น 3 : PJS
PJNAME      SNAME
PROJ2SERI
PROJ1SERI
PROJ1WANIDA

รีเลชั่น SPP
SNAMEPNAMEPJNAME
SERIPENPROJ2
SERITABLEPROJ1
WANIDAPENPROJ1
SERIPENPROJ1

เมื่อแตกรีเลชั่น SPP ออกเป็นรีเลชั่น SP และ PPJ และ PJS แล้ว  หากนำ ทั้ง 3 รีเลชั่นมาเชื่อมโยงกันจะมีข้อมูลเหมือนในรีเลชั่น SPP  ดังนั้นเมื่อ มีการแตกรีเลชั่นออกมา  และมีการเชื่อมโยงรีเลชั่นย่อยนั้นใหม่   หาก ไม่มีข้อมูลที่แตกต่างไปจากรีเลชั่นเดิม  ก็จะสามารถแตกรีเลชั่นนั้นได้ แต่ถ้าหากแตกเป็นรีเลชั่นย่อยแล้วเกิดข้อมูลไม่เหมือนกับรีเลชั่นเดิมก็ให้ ถือว่ารีเลชั่นเดิมนั้นอยู่ในรูปแบบบรรทัดฐานที่ 5 แล้ว  จากตัวอย่าง รีเลชั่น SCPJ เป็นรีเลชั่นที่อยู่ในรูปแบบบรรทัดฐานขั้นที่ 4   โดยมี แอททริบิวต์รหัสผู้ผลิต (SNO)  ชื่อจังหวัดของผู้ผลิต (CITY)  และรหัส โครงการ (PJNO) ประกอบเป็นคีย์หลัก  รีเลชั่นนี้ก็ยังมีปัญหาที่อาจเกิด ความผิดพลาดในการเพิ่มปรับปรุงหรือลบข้อมูลจึงทำการแตก  รีเลชั่น SCPJ ออกเป็นรีเลชั่น SC  CPJ  PJS  แต่ก็เกิดปัญหาเมื่อนำทั้ง 3 รีเลชั่นมาเชื่อมโยงกัน  ก็จะมีข้อมูลเกินมาคือ S1 RAYONG PJ01 ซึ่งไม่มีในรีเลชั่นเดิม
RELATION SCPJ
SNO
CITY 
PJNO
S1BANGKOKPJ01
S1RAYONGPJ02
S3RAYONGPJ01


RELATION SC
SNAME
PNAME
SERIPEN
SERITABLE
WANIDAPEN

PENRELATION CPJ
PNAME PJNAME
PENPROJ2
TABLEPROJ1
PENPROJ1


RELATION PJS
PJNAME
SNAME
PROJ2 
SERI
PROJ1
SERI
PROJ1 
WANIDA

SNAMEPNAMEPJNAME
SERIPENPROJ2
SERITABLEPROJ1
WANIDAPENPROJ1
SERIPENPROJ1