# บทสรุปฐานข้อมูล

ในรอบนี้ **ดช.แมวน้ำ** จะมาสรุป **`ความรู้ขั้นต่ำสุด`** ในการทำงานกับฐานข้อมูล **`ในระดับที่เอาไปทำงานจริงได้`** ให้เพื่อนๆได้เข้าใจกันว่า การทำงานและการออกแบบฐานข้อมูล เขามีวิธีคิด วิธีออกแบบยังไงบ้าง ซึ่งคนไม่มีความรู้เรื่องนี้เลยก็สามารถเข้าใจได้ง่ายๆแน่นอนฮ๊าฟ

{% hint style="danger" %}
**คำเตือน**\
ความรู้ที่จะสอนต่อไปนี้น่าจะเรียกได้ว่า **ถ้าไม่รู้เรื่องพวกนี้ ก็น่าจะไปสายอาชีพนี้ได้ยากม๊วก** ดังนั้นลองเช็คคร่าวๆหน่อยว่ามีข้อไหนที่ตัวเองยังตกหรือเปล่า
{% endhint %}

{% hint style="success" %}
**เกร็ดความรู้**\
Database ในโลกปัจจุบันนั้นมีทั้งหมด 4 ตระกูลหลัก **Graph**, **Key-Value store**, **Document database**, **Column store** ซึ่งแต่ละตระกูลนั้นมันเก่งคนละด้านกัน ซึ่งในรอบนี้เราจะมาเรียนการออกแบบโดยใช้ database ที่ทั่วโลกยังคงนิยมใช้กันอยู่นั่นคือ Relational Database นั่นเอง ซึ่งถ้าเราเข้าใจการออกแบบตัวนี้แล้ว ก็น่าจะแก้ปัญหาได้ 90% ของโลกใบนี้ได้แล้วล่ะ ส่วนที่เหลืออีก 10% คือกรณีพิเศษที่เราจำเป็นต้องไปใช้ตระกูลอื่นๆนั่นเอง ดังนั้นเรียนตัวนี้ไปก่อนก็ไม่เสียหาย เพราะมันยังเป็นพื้นฐานในการคิดของตระกูลอื่นๆด้วยนั่นเอง
{% endhint %}

## 🗃️ ฐานข้อมูลคือไย ?

เวลาที่เราทำแอพอะไรก็ตามแต่ ถ้าแอพของเรามีการบันทึกข้อมูลของผู้ใช้เอาไว้ เช่น เก็บชื่อผู้ใช้ เก็บที่อยู่ บลาๆ นั่นหมายความว่าเราต้องเอาข้อมูลพวกนั้นไปเซฟเก็บไว้ซักที่ ชิมิ? โดยที่ๆเราเอาข้อมูลพวกนั้นไปเซฟไว้นั่นแหละคือ ฐานข้อมูลรูปแบบหนึ่งนั่นเอง เช่น บันทึกเป็นไฟล์เก็บไว้ หรือเชื่อมต่อไปยัง Database ชนิดต่างๆยังไงก็ตาม สิ่งที่แรกเราควรรู้ก่อนทำงานกับฐานข้อมูลก็คือ `💖 วิธีการออกแบบฐานข้อมูล` ซึ่งขั้นตอนในการออกแบบ **ดช.แมวน้ำ** ได้แยกออกเป็นเรื่องๆด้านล่างไว้เรียบร้อยแล้วครัช

## 1.มโน

การออกแบบ Database เริ่มต้นที่การ **`ลองมโนสิ่งที่เก็บในระบบออกมา`**&#xE41;ล้วลองเขียนลงกระดาษเล่นดู ซึ่งอยากฟุ้งซ่านแค่ไหนก็จัดเต็มได้เลย ตามในวีดีโอด้านล่าง

{% embed url="<https://youtu.be/9NNKGI_VdVQ>" %}

## 2.จัดกลุ่มกำจัดขยะ

หลังจากที่ฟุ้งซ่านเสร็จเราก&#xE47;**`เอาทั้งหมดมาลองจัดกลุ่มดู`** จัดผิดจัดถูกก็ทำๆไปเถอะ และหลังจากที่จัดกลุ่มเสร็จ เราก็จะมาดูว่าข้อมูลที่อยู่ในแต่ละกลุ่มนั้น **`มันจำเป็นต่อระบบหรือเปล่า?`** ซึ่งอันไหนที่เราคิดว่ามันไม่จำเป็นเราก็ไล่ลบของพวกนั้นทิ้งไปซะ&#x20;

{% embed url="<https://youtu.be/4-8Jy7oZ8JY>" %}

> ตัดๆทิ้งไปก่อน ถ้ามันจะเป็นเดี๋ยวมันก็กลับมาเอง ส่วนที่ลิสต์ไว้จะถูกกลุ่มหรือเปล่าก็ช่างมัน เดี๋ยวทำไปเรื่อยๆก็จะรู้เองเช่นกัน

## 3.จำลองข้อมูลเล่นดู และ กำหนดคีย์หลัก (Primary key)

หลังจากที่จัดกลุ่มเสร็จหมดละ ถัดไปเราก็จะ **`จำลองข้อมูล`** กันเล่นๆ เพื่อที่จะดูว่าสิ่งที่เราคิดไว้มันดูแล้วโอเคหรือเปล่า ซึ่งถ้าดูแล้วมันพอที่จะใช้ได้อยู่ ถัดไปเราก็จะต้องทำการสร้าง **`Primary Key`** ให้มัน เพื่อให้เราสามารถสั่งดำเนินการต่างๆได้ถูก record ที่เราอยากจะทำ

{% embed url="<https://youtu.be/ipSSwIaXZHA>" %}

{% hint style="info" %}
**Primary Key**\
คือ **คีย์หลัก** ที่เป็นตัวแทนอ้างถึงข้อมูล record นั้นๆ ซึ่งมันจะต้องมีคุณสมบัติคือ Unique หรือพูดง่ายๆคือ มันห้ามซ้ำกับใครเลยนั่นเอง
{% endhint %}

{% hint style="info" %}
**Candidate Key**\
คือ **คีย์ตัวเลือก** มันคือข้อมูลทีมีคุณสมบัติเหมือน Primary Key ทุกประการ เพียงแค่เราไม่ได้เลือกมันเป็น Primary Key เฉยๆ เช่น เวลาเราเป็นนักเรียน เราก็จะมีรหัสประจำตัวนักเรียนชิมิ? ซึ่งรหัสประจำตัวนักเรียนแต่ละคนก็ไม่ซ้ำกันเลย และ เราใช้รหัสประจำตัวนักเรียนเป็น Primary Key เพราะเวลาคุณครูจะพูดถึงเรา เขาก็จะพูดรหัสประจำตัวนักเรียนยังไงล่ะ แต่จริงๆแล้วเราก็มี รหัสประชาชน อยู่เหมือนกัน ซึ่งมันก็ไม่ซ้ำกับใครเลยในโรงเรียนของเราเช่นกัน แต่ในโรงเรียนไม่นิยมเรียกนักเรียนด้วยรหัสประชาชน ดังนั้นในกรณีนี้ รหัสประชาชนเลยเป็นแค่ Candidate Key เท่านั้น
{% endhint %}

## 4.ความสัมพันธ์ของตาราง

คราวนี้เราก็จะมาดูความสัมพันธ์ของตารางแต่ละตัวกัน ซึ่งหลักๆจะมีทั้งหมด 3 รูปแบบคือ `1:1` , `1:Many` และ `Many:Many` โดยที่ความสัมพันธ์แต่ละรูปแบบนั้นก็จะมีวิธีในการออกแบบที่แตกต่างกันไป ตามในวีดีโอด้านล่าง

{% embed url="<https://youtu.be/ivFAp_LNfMU>" %}

| ความสัมพันธ์ | การออกแบบ                                                                                                                                                       |
| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| 1:1          | <p>เลือก Primary Key ของตารางไหนก็ได้ ไปใส่อีกตารางหนึ่ง<br>เพื่อใช้เป็น Foreign Key</p>                                                                        |
| 1:Many       | <p>เลือก Primary Key ของตารางที่เป็น 1 ไปใส่ในตารางที่เป็น Many<br>เพื่อนำไปเป็น Foreign Key</p>                                                                |
| Many:Many    | <p>สร้างตารางใหม่ขึ้นมา โดยนำ Primary Key ของทั้ง 2 ตารางเข้าไปในตารางใหม่</p><p>เพื่อนำไปเป็น Foreign Key และแนะนำให้สร้าง Primary Key ของตัวเองขึ้นมาด้วย</p> |

## **5.Normalization**

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

### เกริ่น

{% embed url="<https://youtu.be/Zq6Od1d2Z1w>" %}

### 1st Normal Form

{% embed url="<https://youtu.be/dyKeNkSvp5s>" %}

### 2nd & 3rd Normal Forms

{% embed url="<https://youtu.be/3gda4S-V7ck>" %}

{% hint style="warning" %}
**บทความนี้กำลังทำอยู่** คาดว่าจะเสร็จราวๆวันอาทิตย์ที่ 23/02/2020 นี้แหละ ส่วนใครที่ไม่อยากพลาดอัพเดทก็เข้าไปกดติดตามที่ลิงค์นี้ [**Mr.Saladpuk**](https://www.facebook.com/mr.saladpuk) ได้เลย และถ้าช่วยกดแชร์ด้วยจะเป็นพระคุณอย่างมากครัช
{% endhint %}

## วีดีโอตัวถัดไปที่จะทำ

* Tips การใช้งานจริง
* * Denormalization
  * Bottlenecks
  * Paging
  * Calculation value
  * Lean computations
* ~~Design Document database (MongoDB)~~ **เดี๋ยวเปิดสอนการทำ MongoDb เป็นอีกคอร์สเลยละกัน**
* คิดไรได้เดี๋ยวเอามาใส่ต่อ

{% content-ref url="/pages/-M2YHF7SLc3yUYmZ3enP" %}
[เก็บรูปในฐานข้อมูล](/beginner-1/database-design/img-handling.md)
{% endcontent-ref %}

{% content-ref url="/pages/-M2J6cBoHeySANjfFe5p" %}
[Database indexing](/beginner-1/database-design/database-indexing.md)
{% endcontent-ref %}

{% content-ref url="/pages/-M2f9GWnyrGEwod\_HVKU" %}
[การลบข้อมูล](/beginner-1/database-design/delete-records.md)
{% endcontent-ref %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://www.saladpuk.com/beginner-1/database-design.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
