ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingขอสอบถามหลักการออกแบบฐานข้อมูลครับ
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: ขอสอบถามหลักการออกแบบฐานข้อมูลครับ  (อ่าน 1472 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
kanin03
สมุนแก๊งเสียว
*

พลังน้ำใจ: 53
ออฟไลน์ ออฟไลน์

กระทู้: 500



ดูรายละเอียด
« เมื่อ: 18 สิงหาคม 2015, 15:13:50 »

คือว่าผมกำลัง งง กับการออกแบบฐานข้อมูล mysql โดยมีข้อมูลที่ต้องเก็บในลักษณะนี้ครับ

สมมุติว่า เราต้องการเก็บข้อมูล รถคันนึง โดยที่รถคันนั้นมี ประกันภัยมาเกี่ยวข้องด้วย ซึ่งประกันภัยนั้นมีวันหมดอายุ เมื่อหมดอายุเราต้องเพิ่มประกันภัยของรถคันนั้นเข้าไปใหม่โดยสามารถทราบข้อมูลประกันภัยอันเก่าได้ด้วย (history)

เราควรจะออกแบบอย่างไรดีครับ

เท่าที่ผมคิดไว้ 2 แบบคือ

แบบแรก many-to-many

มีตารางของรถ ตารางของประกัน และตารางของประวัติประกัน

อ้างถึง
ตารางรถ มีคอลั่ม : ชื่อรถ, รายละเอียด
ตารางประกัน มีคอลั่ม : เวลาหมดประกันรถหาย (timestamp nullable), เวลาหมดประกันรถชน (timstamp nullable)
ตารางประวัติประกัน มีคอลั่ม : id_รถ, id_ประกัน

ซึ่งเวลาหาว่ารถคันนั้นมีประกันไหมหมดเมื่อไหร่ก็จะดูจากตารางประวัติประกัน อ้างอิงจาก id_รถ แล้วเลือกอันล่าสุด

หรือแบบที่ 2 one-to-many

อ้างถึง
ตารางรถ มีคอลั่ม : ชื่อรถ, รายละเอียด
ตารางประกัน มีคอลั่ม : id_รถ, เวลาหมดประกันรถหาย (timestamp nullable), เวลาหมดประกันรถชน (timstamp nullable)

ซึ่งเวลาหาว่ารถคันนั้นมีประกันไหมหมดเมื่อไหร่ก็จะดูจากตารางประกัน อ้างอิงจาก id_รถ แล้วเลือกอันล่าสุด

ผมกำลัง สับสนว่าทั้ง 2 แบบมันแตกต่างกันอย่างไรแล้วควรจะใช้แบบไหนดี

หรือท่านใดมีแบบอื่นแนะนำ รบกวนทีครับ

ขอบพระคุณมากๆครับ  wanwan017
« แก้ไขครั้งสุดท้าย: 18 สิงหาคม 2015, 15:14:53 โดย kanin03 » บันทึกการเข้า
imagineverend
สมุนแก๊งเสียว
*

พลังน้ำใจ: 178
ออฟไลน์ ออฟไลน์

กระทู้: 912



ดูรายละเอียด
« ตอบ #1 เมื่อ: 18 สิงหาคม 2015, 15:46:30 »

เป็นผมจะทำ 2 ตารางครับ ทำแค่นี้เราก็เล่นได้หมดครับ ว่าจะเอาอะไรมาแสดง
จะคลิกชื่อรถแล้วไปดูประวัติ(ประกัน)ของรถคันนั้น หรือ จะคลิกประกันแล้วดูว่าเป็นรถคันไหน

tbl_car
car_id
car_name
car_desc
..

tbl_insure
car_id
insure_id
insure_lost
insure_accident
insure_expire
...
บันทึกการเข้า
kanin03
สมุนแก๊งเสียว
*

พลังน้ำใจ: 53
ออฟไลน์ ออฟไลน์

กระทู้: 500



ดูรายละเอียด
« ตอบ #2 เมื่อ: 18 สิงหาคม 2015, 15:53:46 »

เป็นผมจะทำ 2 ตารางครับ ทำแค่นี้เราก็เล่นได้หมดครับ ว่าจะเอาอะไรมาแสดง
จะคลิกชื่อรถแล้วไปดูประวัติ(ประกัน)ของรถคันนั้น หรือ จะคลิกประกันแล้วดูว่าเป็นรถคันไหน

tbl_car
car_id
car_name
car_desc
..

tbl_insure
car_id
insure_id
insure_lost
insure_accident
insure_expire
...

ขอบคุณมากครับผม ผมก็คิดไว้แบบนี้แต่กลัวว่าจะคิดอะไรผิดไป  wanwan017

ขอถามอีกนิดครับคือว่าถ้าหากเราจะใช้ แบบที่ 1 ที่มี 3 ตาราง ตารางประกันมันจะต้องมีคอลั่มใดคอลั่มหนึ่งที่เป็นแบบ unique หรือปล่าวครับเพราะมันจะเพิ่มซ้ำๆกันไม่ได้

อย่างเช่น หากผมเปลี่ยนจากรถ - ประกัน กลายเป็น รถ - เลขทะเบียน การออกแบบก็ควรจะเป็นแบบ 3 ตารางถูกไหมครับท่านเพราะเลขทะเบียนมันเพิ่มซ้ำๆกันไม่ได้
« แก้ไขครั้งสุดท้าย: 18 สิงหาคม 2015, 16:01:22 โดย kanin03 » บันทึกการเข้า
imagineverend
สมุนแก๊งเสียว
*

พลังน้ำใจ: 178
ออฟไลน์ ออฟไลน์

กระทู้: 912



ดูรายละเอียด
« ตอบ #3 เมื่อ: 18 สิงหาคม 2015, 16:58:33 »

เป็นผมจะทำ 2 ตารางครับ ทำแค่นี้เราก็เล่นได้หมดครับ ว่าจะเอาอะไรมาแสดง
จะคลิกชื่อรถแล้วไปดูประวัติ(ประกัน)ของรถคันนั้น หรือ จะคลิกประกันแล้วดูว่าเป็นรถคันไหน

tbl_car
car_id
car_name
car_desc
..

tbl_insure
car_id
insure_id
insure_lost
insure_accident
insure_expire
...

ขอบคุณมากครับผม ผมก็คิดไว้แบบนี้แต่กลัวว่าจะคิดอะไรผิดไป  wanwan017

ขอถามอีกนิดครับคือว่าถ้าหากเราจะใช้ แบบที่ 1 ที่มี 3 ตาราง ตารางประกันมันจะต้องมีคอลั่มใดคอลั่มหนึ่งที่เป็นแบบ unique หรือปล่าวครับเพราะมันจะเพิ่มซ้ำๆกันไม่ได้

อย่างเช่น หากผมเปลี่ยนจากรถ - ประกัน กลายเป็น รถ - เลขทะเบียน การออกแบบก็ควรจะเป็นแบบ 3 ตารางถูกไหมครับท่านเพราะเลขทะเบียนมันเพิ่มซ้ำๆกันไม่ได้

เลขทะเบียนรถ มันก็ควรจะอยู่ที่ตารางของรถ ไม่น่าจะต้องทำแยกนะครับ
tbl_car
car_id
car_name
car_desc
..
car_registration //ทะเบียนรถ
บันทึกการเข้า
kanin03
สมุนแก๊งเสียว
*

พลังน้ำใจ: 53
ออฟไลน์ ออฟไลน์

กระทู้: 500



ดูรายละเอียด
« ตอบ #4 เมื่อ: 18 สิงหาคม 2015, 17:32:39 »

เป็นผมจะทำ 2 ตารางครับ ทำแค่นี้เราก็เล่นได้หมดครับ ว่าจะเอาอะไรมาแสดง
จะคลิกชื่อรถแล้วไปดูประวัติ(ประกัน)ของรถคันนั้น หรือ จะคลิกประกันแล้วดูว่าเป็นรถคันไหน

tbl_car
car_id
car_name
car_desc
..

tbl_insure
car_id
insure_id
insure_lost
insure_accident
insure_expire
...

ขอบคุณมากครับผม ผมก็คิดไว้แบบนี้แต่กลัวว่าจะคิดอะไรผิดไป  wanwan017

ขอถามอีกนิดครับคือว่าถ้าหากเราจะใช้ แบบที่ 1 ที่มี 3 ตาราง ตารางประกันมันจะต้องมีคอลั่มใดคอลั่มหนึ่งที่เป็นแบบ unique หรือปล่าวครับเพราะมันจะเพิ่มซ้ำๆกันไม่ได้

อย่างเช่น หากผมเปลี่ยนจากรถ - ประกัน กลายเป็น รถ - เลขทะเบียน การออกแบบก็ควรจะเป็นแบบ 3 ตารางถูกไหมครับท่านเพราะเลขทะเบียนมันเพิ่มซ้ำๆกันไม่ได้

เลขทะเบียนรถ มันก็ควรจะอยู่ที่ตารางของรถ ไม่น่าจะต้องทำแยกนะครับ
tbl_car
car_id
car_name
car_desc
..
car_registration //ทะเบียนรถ

คือว่าเลขทะเบียนก็มีโอกาสเปลี่ยนไปใช้เลขอื่นได้อ่าครับ แล้วก็ต้องมี ประวัติด้วยว่า รถคันนี้เคยมีเลขทะเบียนอะไรบ้าง  wanwan017
« แก้ไขครั้งสุดท้าย: 18 สิงหาคม 2015, 17:32:59 โดย kanin03 » บันทึกการเข้า
imagineverend
สมุนแก๊งเสียว
*

พลังน้ำใจ: 178
ออฟไลน์ ออฟไลน์

กระทู้: 912



ดูรายละเอียด
« ตอบ #5 เมื่อ: 18 สิงหาคม 2015, 17:42:54 »

อ้างถึง
คือว่าเลขทะเบียนก็มีโอกาสเปลี่ยนไปใช้เลขอื่นได้อ่าครับ แล้วก็ต้องมี ประวัติด้วยว่า รถคันนี้เคยมีเลขทะเบียนอะไรบ้าง  wanwan017

งั้นก็เพิ่มตารางเข้าไป จัดการง่ายเลย

tbl_registration
car_id
reg_id
reg_name
reg_....


บันทึกการเข้า
kanin03
สมุนแก๊งเสียว
*

พลังน้ำใจ: 53
ออฟไลน์ ออฟไลน์

กระทู้: 500



ดูรายละเอียด
« ตอบ #6 เมื่อ: 19 สิงหาคม 2015, 13:30:23 »

ขอบคุณ ท่าน imagineverend มากครับ  wanwan017
บันทึกการเข้า
MapTwoZa
ก๊วนเสียว
*

พลังน้ำใจ: 75
ออฟไลน์ ออฟไลน์

กระทู้: 366



ดูรายละเอียด
« ตอบ #7 เมื่อ: 19 สิงหาคม 2015, 15:50:18 »


to จขกท ผมเสริมให้นิดนึง เดี๋ยวจะเข้าใจผิดไปยาว

ผมพูดถึง case ที่ท่านออกแบบ เป็น many to many นะครับ ผมมองว่ายังไงมันก็คือ one to many ไม่ใช่ many to many

1. การที่มันจะเป็น many to many นั้นมันต้องเป็น many to many โดยธรรมชาติจริงๆครับ ไม่เกี่ยวกับการ join table เลยครับ
2. การที่มันเป็น one to many มันก็ join table ได้นะครับ ไม่ผิดหลักการออกแบบเลยครับ (ซึ่งมันก็คือ อันที่ท่านมองมันเป็น many to many นั่นแหละ แค่ต้องสร้าง unique key ของ fk ของฝั่งที่เป็น many ครับ )

บันทึกการเข้า

Good code quality Developer Cheesy
kanin03
สมุนแก๊งเสียว
*

พลังน้ำใจ: 53
ออฟไลน์ ออฟไลน์

กระทู้: 500



ดูรายละเอียด
« ตอบ #8 เมื่อ: 20 สิงหาคม 2015, 19:46:00 »


to จขกท ผมเสริมให้นิดนึง เดี๋ยวจะเข้าใจผิดไปยาว

ผมพูดถึง case ที่ท่านออกแบบ เป็น many to many นะครับ ผมมองว่ายังไงมันก็คือ one to many ไม่ใช่ many to many

1. การที่มันจะเป็น many to many นั้นมันต้องเป็น many to many โดยธรรมชาติจริงๆครับ ไม่เกี่ยวกับการ join table เลยครับ
2. การที่มันเป็น one to many มันก็ join table ได้นะครับ ไม่ผิดหลักการออกแบบเลยครับ (ซึ่งมันก็คือ อันที่ท่านมองมันเป็น many to many นั่นแหละ แค่ต้องสร้าง unique key ของ fk ของฝั่งที่เป็น many ครับ )



ขอบคุณท่าน MapTwoZa มากครับผม  wanwan017

ผมอ่านแล้วยังไม่ค่อยเข้าใจความหมายของข้อ 2 เท่าไหร่นะครับ คือท่านจะบอกว่า one to many สามารถออกแบบแบบ 3 ตารางได้ใช่หรอไม่ครับ
« แก้ไขครั้งสุดท้าย: 21 สิงหาคม 2015, 11:34:20 โดย kanin03 » บันทึกการเข้า
MapTwoZa
ก๊วนเสียว
*

พลังน้ำใจ: 75
ออฟไลน์ ออฟไลน์

กระทู้: 366



ดูรายละเอียด
« ตอบ #9 เมื่อ: 21 สิงหาคม 2015, 18:07:41 »


to จขกท ผมเสริมให้นิดนึง เดี๋ยวจะเข้าใจผิดไปยาว

ผมพูดถึง case ที่ท่านออกแบบ เป็น many to many นะครับ ผมมองว่ายังไงมันก็คือ one to many ไม่ใช่ many to many

1. การที่มันจะเป็น many to many นั้นมันต้องเป็น many to many โดยธรรมชาติจริงๆครับ ไม่เกี่ยวกับการ join table เลยครับ
2. การที่มันเป็น one to many มันก็ join table ได้นะครับ ไม่ผิดหลักการออกแบบเลยครับ (ซึ่งมันก็คือ อันที่ท่านมองมันเป็น many to many นั่นแหละ แค่ต้องสร้าง unique key ของ fk ของฝั่งที่เป็น many ครับ )



ขอบคุณท่าน MapTwoZa มากครับผม  wanwan017

ผมอ่านแล้วยังไม่ค่อยเข้าใจความหมายของข้อ 2 เท่าไหร่นะครับ คือท่านจะบอกว่า one to many สามารถออกแบบแบบ 3 ตารางได้ใช่หรอไม่ครับ


ใช่แล้วครับ Smiley
บันทึกการเข้า

Good code quality Developer Cheesy
kanin03
สมุนแก๊งเสียว
*

พลังน้ำใจ: 53
ออฟไลน์ ออฟไลน์

กระทู้: 500



ดูรายละเอียด
« ตอบ #10 เมื่อ: 21 สิงหาคม 2015, 18:59:59 »

 wanwan017 ขอบคุณอีกครั้งครับ
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
พิมพ์