Notion จากศูนย์ถึงโปร ตอนที่ 5 — Relations และ Rollups เชื่อมข้อมูลไม่ให้ซ้ำ
ซีรีส์ "Notion จากศูนย์ถึงโปร" ลงวันละตอนรวม 8 ตอน — ตามอ่านทั้งชุดได้ที่หมวดคู่มือเครื่องมือ
ฐานข้อมูลงานตอนนี้มี property "หมวด" เป็น multi-select ใช้แยกงานคร่าว ๆ ได้ แต่พอมีโปรเจกต์จริงจังหลายโปรเจกต์ปัญหาจะเริ่มโผล่ งานแต่ละชิ้นอยากรู้ว่ามันอยู่โปรเจกต์ไหน อยากรู้ว่าโปรเจกต์นั้นเสร็จไปกี่เปอร์เซ็นต์แล้ว ถ้ายังใช้ text หรือ select ธรรมดา ทางเดียวที่ทำได้คือพิมพ์ชื่อโปรเจกต์ซ้ำในทุกแถวงาน แล้ววันหนึ่งเปลี่ยนชื่อโปรเจกต์ ก็ต้องไล่แก้ทีละแถวเอง
ปัญหาที่ relation แก้
Relation แก้ปัญหานี้ตรงจุด แทนที่จะพิมพ์ชื่อซ้ำ ให้สร้างฐานข้อมูล "โปรเจกต์" แยกออกมาต่างหาก แล้ว เชื่อม แถวงานแต่ละแถวเข้ากับแถวโปรเจกต์ที่มันสังกัดอยู่ ข้อมูลชื่อโปรเจกต์อยู่ที่เดียวคือในฐานข้อมูลโปรเจกต์ ส่วนฐานข้อมูลงานแค่อ้างถึงมัน เปลี่ยนชื่อโปรเจกต์ที่เดียว ทุกงานที่เชื่อมอยู่เห็นชื่อใหม่ทันทีโดยไม่ต้องแก้อะไรเพิ่ม
นี่คือแนวคิดใหญ่ของทั้งบทนี้: ข้อมูลอยู่ที่เดียว อ้างถึงได้ทุกที่ เป็นหลักเดียวกับที่ฐานข้อมูลทุกระบบใหญ่ ๆ ในโลกใช้ ไม่ใช่แค่ Notion
สร้าง relation
- สร้างฐานข้อมูล full page ใหม่ชื่อ "โปรเจกต์" ใส่ property พื้นฐานเช่นชื่อโปรเจกต์กับสถานะ แล้วเพิ่มแถวโปรเจกต์จริงสักสองสามอัน
- กลับไปที่ฐานข้อมูลงาน เพิ่ม property ใหม่ชนิด Relation ตั้งชื่อว่า "โปรเจกต์" แล้วเลือกให้ชี้ไปที่ฐานข้อมูลโปรเจกต์ที่เพิ่งสร้าง
- ในแต่ละแถวงาน คลิกช่อง relation แล้วเลือกโปรเจกต์ที่งานนั้นสังกัด เลือกได้จากรายชื่อจริงในฐานข้อมูลโปรเจกต์ ไม่ต้องพิมพ์เอง พิมพ์ผิดไม่ได้เพราะเลือกจากลิสต์
- สังเกตว่าพอเชื่อมเสร็จ ฝั่งฐานข้อมูลโปรเจกต์จะมีคอลัมน์ใหม่โผล่ขึ้นมาเองชื่อ "งาน" แสดงรายชื่องานทั้งหมดที่เชื่อมกลับมา relation ทำงานสองทางเสมอ
Rollup: ดึงตัวเลขสรุปข้ามฐานข้อมูล
พอเชื่อมสองฐานข้อมูลด้วย relation แล้ว จะเริ่มดึงข้อมูลจากฝั่งงานมาสรุปที่ฝั่งโปรเจกต์ได้ นี่คือหน้าที่ของ Rollup
ตัวอย่างที่ใช้บ่อยที่สุด: อยากรู้ว่าโปรเจกต์หนึ่งมีงานทั้งหมดกี่ชิ้น เสร็จไปแล้วกี่ชิ้น วิธีทำ
- ในฐานข้อมูลโปรเจกต์ เพิ่ม property ชนิด Rollup ตั้งชื่อ "งานทั้งหมด"
- เลือก relation ที่จะดึงข้อมูลมา (คือ "งาน" ที่โผล่มาเองจากขั้นตอนก่อนหน้า)
- เลือก property ที่จะนับจากฝั่งนั้น เลือกชื่อรายการ แล้วเลือกวิธีคำนวณเป็น Count all จะได้จำนวนงานทั้งหมดในโปรเจกต์นั้น
- เพิ่ม rollup อีกตัวชื่อ "งานเสร็จแล้ว" ทำแบบเดียวกันแต่เลือกวิธีคำนวณเป็น Count values พร้อมกรองเฉพาะแถวที่สถานะเป็น "เสร็จแล้ว"
ตอนนี้ฐานข้อมูลโปรเจกต์จะมีตัวเลขสองคอลัมน์ที่อัปเดตเองทุกครั้งที่งานในฐานข้อมูลงานเปลี่ยนสถานะ ไม่ต้องนับมือ ไม่ต้องจำว่าอัปเดตหรือยัง
ระวังอย่าสร้างฐานข้อมูลแยกเมื่อควรเป็น view ของอันเดิม
ข้อผิดพลาดที่พบบ่อยพอ ๆ กับการไม่ใช้ relation เลย คือใช้มันเกิน สร้างฐานข้อมูลใหม่ทุกครั้งที่อยากมองข้อมูลอีกมุม ทั้งที่จริงแล้วสิ่งที่ต้องการคือ view ใหม่ของฐานข้อมูลเดิม ไม่ใช่ฐานข้อมูลใหม่
วิธีแยกให้ออก: ถ้าสองชุดข้อมูลมี "ตัวตน" ต่างกันจริง เช่นงานกับโปรเจกต์เป็นคนละสิ่งกันชัดเจน แบบนี้ควรแยกฐานข้อมูลแล้วเชื่อมด้วย relation แต่ถ้าแค่อยากดูงานชุดเดียวกันคนละมุม เช่นงานของเดือนนี้กับงานของเดือนที่แล้ว นั่นคือ view ที่ต่าง filter กัน ไม่ใช่ฐานข้อมูลคนละอัน สร้างฐานข้อมูลแยกเกินจำเป็นจะกลับไปเจอปัญหาเดิมคือข้อมูลซ้ำที่ relation ควรมาแก้ตั้งแต่แรก
ทดสอบง่าย ๆ ก่อนสร้างฐานข้อมูลใหม่ทุกครั้ง: ถามว่าสิ่งนี้ "เป็น" งานหรือแค่ "มอง" งานคนละมุม ถ้าเป็นอย่างหลัง กลับไปสร้าง view แทน
พรุ่งนี้ ตอนที่ 6: เมื่อ property ต้องคำนวณเองได้ ไม่ต้องรอมานั่งกรอกมือทุกครั้ง — เข้าเรื่อง formulas พร้อมตัวอย่างสูตรที่ใช้ได้จริงสามแบบ