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

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

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

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

กระทู้: 4,097



ดูรายละเอียด
« เมื่อ: 27 ธันวาคม 2011, 18:11:59 »




ดูตรง table Patient_Address ที่ใช้สำหรับเก็บว่า user มีที่อยู่ตรงกับ address_id ไหนทีครับ

คือผมสงสัยหลายอันแล้วเวลาเราเก็บ user กับ address จะมีตารางอย่าง Patient_Address เพื่อใช้สำหรับจับคู่ที่อยู่
ที่นี้ผมสงสัยตรงคอลัม date_address_from กับ date_address_from ว่ามันคืออะไรครับ แล้วทำไมต้องใส่เป็น primary key ด้วย

แล้วถ้าคน 1 คน มีหลายที่อยู่ผมจะจัดเก็บตารางอย่างไรครับ

ขอบคุณครับ
บันทึกการเข้า
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

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

กระทู้: 12,516



ดูรายละเอียด
« ตอบ #1 เมื่อ: 27 ธันวาคม 2011, 18:55:32 »

อันนี้ผมคิดเองนะ
date_address_from คือวันที่ลงบันทึกข้อมูล
date_address_to คือวันที่ลงบันทึกว่าข้อมูลนี้หมดอายุ หรือใช้การไม่ได้

แล้วที่ใช้ date_address_from เป็น pk คือเป็นการลงวันที่ปัจจุบันที่มีการคีย์ลงไป
แต่มองจริงๆ คิดว่าน่าจะเป็นข้อมูลแบบ datetime
ถึงจะใช้เป็น pk ได้ แต่ถ้าจะใช้ date ก็จำเป็นต้องสร้าง pk แยกเป็น auto number รันไป

ส่วนการคีย์ข้อมูลว่า 1 คนมีหลายที่อยู่ คิดว่าทำได้

ปกติจะคีย์ข้อมูลที่อยู่ปัจจุบันที่ติดต่อได้
INSERT ข้อมูล Addresses ก่อน
แล้วเอา address_id มาลง Patient_Addresses พร้อมกับ patient_id จาก Patients

แล้วตอน INSERT ลง Patient_Addresses จะลงแค่ 3 ค่า
patient_id, address_id, date_address_from (อันนี้ลงเวลา ณ ตอนนั้นเลย เช่น NOW() )
โดยปล่อย date_address_to เป็น NULL
นั้นคือข้อมูลยังไม่หมดอายุ

แล้วพอมี 2 ที่อยู่ ก็ทำแบบเดิม ก็เท่ากับว่าจะมี 2 record ที่มี patient_id ซ้ำกัน
เวลา SELECT หาที่อยู่ปัจจุบันก็ where patient_id หา id คนป่วย และ date_address_to = NULL
ก็น่าจะคืนมา 2 record

ส่วนใครเปลี่ยนที่อยู่ ก็เพิ่มที่อยู่ใหม่ลงไป แล้ว UPDATE ที่อยู่เก่าเพิ่ม date_address_to = NOW()
ว่าเปลี่ยนที่อยู่หมดอายุเอาตรงวันนี้

ถูกผิดมึนยังไงก็ขออภัย  Tongue

ปล. เคยเห็นใน stackoverflow
« แก้ไขครั้งสุดท้าย: 27 ธันวาคม 2011, 19:05:43 โดย EThaiZone » บันทึกการเข้า

gilbert
สมุนแก๊งเสียว
*

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

กระทู้: 713



ดูรายละเอียด
« ตอบ #2 เมื่อ: 27 ธันวาคม 2011, 19:52:16 »

ความหมายคือ ตางรางผู้ป่วย มีความสัมพันธ์เป็น many to many กับ ตารางที่อยู่ครับ กล่าวคือ ผู้ป่วยหนึ่งคนมีที่อยู่ได้หลายที่ และ ที่อยู่หนึ่งที่มีผู้ป่วยได้หลายคน

ความสัมพันธ์ดังกล่าวทำให้เกิด ตางราง อีกตารางขึ้นมาครับ ซึ่งจะนิยมใช้ วันเวลาเป็นคีย์หลัก เพราะว่าค่ามันจะไม่ซ้ำครับ (ถ้าซ้ำก็จะใช้ คีย์รองเป็นคีย์ร่วมในคีย์หลักครับ)


อันนี้เป็นตัวอย่างการเก็บข้อมูลครับ

Table address
address_idcity
1กรุงเทพฯ
2สระบุรี

Table patient
patient_idpatient_first_name
1ภัทรวุธ จันทร์งาม
2นิสาชล จันทร์งาม

Table patient_address
patient_idaddress_iddate_address_from
1101/01/2001
1201/01/2002
2101/01/2001


จากตัวอย่างข้อมูลจะเห็นว่า ภัทรวุธ จันทร์งาม มีที่อยู่ 2 ที่ คือ กรุงเทพฯ และสระบุรี   และที่อยู่ที่กรุงเทพฯ ก็มี ภัทรวุธ กับนิสาชล อาศัยอยู่ ครับ
« แก้ไขครั้งสุดท้าย: 27 ธันวาคม 2011, 20:10:22 โดย gilbert » บันทึกการเข้า
FastColian
คนรักเสียว
*

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

กระทู้: 177



ดูรายละเอียด เว็บไซต์
« ตอบ #3 เมื่อ: 27 ธันวาคม 2011, 19:56:19 »

แอบงง สำหรับผมว่า ดาต้าเบส flow นี้ น่าจะ เหมาะสำหรับการใช้ ใน การยืดหยุ่น ครับ

เช่น patient_id  เป็นรหัสคนป่วย เท่ากับ 1 (เก็บมาจากตาราง Patients)

address_id  = 1 (เก็บมาจากตาราง Addresses อันนี้บ้านหลังที่ 1 )

date_address_from  เป็นวันสำหรับวันที่ที่ใช้บันทึกข้อมูล ใช้เป็นเงื่อนไขในการเรียกดูในช่วงระยะเวลานั้น ส่วน PK นี่ ตอนแรียนอาจารย์บอกห้ามซ้ำกัน แต่ใน E-Book ฝรั่ง บอกซ้ำกันได้(แอบงง) เลยคิดว่าใช้เป็นเงือนไขในการเรียกดูข้อมูล




ถ้าลูกค้ามีหลายที่อยู่


ก็บันทึก ที่ table Patient_Address

patient_id = 1  เป็นรหัสคนป่วยคนที่ 1
address_id  = 2 (เก็บมาจากตาราง Addresses อันนี้บ้านอยู่กับเมีย )

patient_id = 1   เป็นรหัสคนป่วยที่ 1
address_id  = 2 (เก็บมาจากตาราง Addresses อันนี้บ้านลูก )


ถ้ามีที่อยู่แห่งที่สาม
patient_id = 1   เป็นรหัสคนป่วยที่ 1
address_id  = 3 (เก็บมาจากตาราง Addresses อันนี้บ้านเมียน้อย )


---------------------------------


แล้วถ้า เมียคนป่วย มาโรงพยาบาลละ

patient_id   = 2  เป็นรหัสคนป่วยคนที่ 2
address_id  = 1 (เก็บมาจากตาราง Addresses ที่อยู่เมีย เป็น address_id  = 1 เหมือนกันกับสามี )


แล้ว ถ้าลูกมาด้วยละ
patient_id   =  3 เป็นรหัสคนป่วยคนที่ 3
address_id  = 2 (เก็บมาจากตาราง Addresses ที่อยู่เมีย เป็น address_id  = 2 )


แสดงว่า คนนึงสามารภมีที่อยู่ได้ ไม่จำกัด บ้าน บ้านลูก บ้านเมีย บ้านเมียน้อย ออฟฟิต เป็นต้น
และ ที่อยู่หนี่ง สามารถมีคนอยู่ได้ หลายคน เช่น พ่อ แม่ หรือ ลูก ลูกของลูก เมียของลูก งง 55


ถ้าไม่ถูกก็ขออภัยเช่นกัน

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

nunewnew
Newbie
*

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

กระทู้: 5



ดูรายละเอียด เว็บไซต์
« ตอบ #4 เมื่อ: 27 ธันวาคม 2011, 20:35:10 »

เฮ้อ
« แก้ไขครั้งสุดท้าย: 19 กันยายน 2012, 22:06:13 โดย nunewnew » บันทึกการเข้า

 *Link Removed*  |  *Link Removed*  |  *Link Removed*  |  *Link Removed*
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

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

กระทู้: 12,516



ดูรายละเอียด
« ตอบ #5 เมื่อ: 28 ธันวาคม 2011, 10:29:02 »

ในที่ฝรั่งสอนกันว่า PK ซ้ำกันได้ ผมไม่รู้ว่าที่ไหนสอนนะ อยากรู้ชื่อคนเขียน จะได้จำว่าไว้ต้องไปอ่านของคนนั้น  Lips Sealed

PK ตามหลักห้ามซ้ำครับ เพราะมันต้องเป็น Unique เพื่อทำให้เวลาเรา seek ข้อมูลแบบ id ไว้และชัดเจน
แต่ PK ไม่จำเป็นต้องเป็น Auto increase number สามารถเป็นอะไรก็ได้ ข้อแค่มัน Unique
เพียงแต่ถ้า Length มันเยอะ เวลาทำ Index หรือการ Seek มันจะช้าลง
บันทึกการเข้า

seowizard
หัวหน้าแก๊งเสียว
*

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

กระทู้: 1,119



ดูรายละเอียด เว็บไซต์
« ตอบ #6 เมื่อ: 28 ธันวาคม 2011, 10:52:31 »

อ้างถึง
แล้วถ้าคน 1 คน มีหลายที่อยู่ผมจะจัดเก็บตารางอย่างไรครับ

จากที่เขาออกแบบมันก็เป็น one-to-many อยู่แล้วนะครับ 

Patient
patient_id = 1


Address
address_id = 1
-------------
address_id = 2


Patient_Address
patient_id = 1
address_id = 1
---------
patient_id = 1
address_id = 2


จริง ๆในตาราง Patient_Address สามารถที่จะมี PK ร่วมโดยใช้ patient_id กับ address_id ก็ได้ครับ
ส่วนที่เขาใช้ date_address_from เป็น PK คิดว่ามัน unique ในตัวอยู่แล้ว ส่วนความหมายน่าจะเป็นวันเข้า-ออกโรงพยาบาล
บันทึกการเข้า
TOOAds.com
บุคคลทั่วไป
« ตอบ #7 เมื่อ: 28 ธันวาคม 2011, 12:14:02 »

งงว่าใน 1ตารางมันตั้ง PK ได้มากกว่า1 หรอครับ เป็นแค่รูป หรือตั้งไปแล้ว
บันทึกการเข้า
gilbert
สมุนแก๊งเสียว
*

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

กระทู้: 713



ดูรายละเอียด
« ตอบ #8 เมื่อ: 28 ธันวาคม 2011, 16:21:45 »

งงว่าใน 1ตารางมันตั้ง PK ได้มากกว่า1 หรอครับ เป็นแค่รูป หรือตั้งไปแล้ว

ได้ครับเป็น คีย์ร่วมกัน
บันทึกการเข้า
EThaiZone
เจ้าพ่อโลลิค่อน
เจ้าพ่อบอร์ดเสียว
*

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

กระทู้: 12,516



ดูรายละเอียด
« ตอบ #9 เมื่อ: 28 ธันวาคม 2011, 21:02:34 »

งงว่าใน 1ตารางมันตั้ง PK ได้มากกว่า1 หรอครับ เป็นแค่รูป หรือตั้งไปแล้ว

ใน Mysql ก็ทำได้ครับ โดยสร้าง Index อันหนึ่ง ยัดฟิลด์ลง 2 ฟิลด์ แล้วทำ Unique
ผมเคยใช้กับงานบัญชีเพื่อป้องกันการคีย์ข้อมูลซ้ำ (ฟิลด์วันที่ คู่กับ ฟิลด์จำนวนสินค้า)
บันทึกการเข้า

*~เก้าคุง~*
สายตรวจเสียวบอร์ด
Moderator
เจ้าพ่อบอร์ดเสียว
*****

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

กระทู้: 4,097



ดูรายละเอียด
« ตอบ #10 เมื่อ: 29 ธันวาคม 2011, 00:29:27 »

date_address_from ผมก็ยังไม่ค่อยเข้าใจว่า ทำไมต้องห้ามข้อมูลซ้ำกัน คือสมมติเราคีย์ข้อมูลที่อยู่ลงไปใหม่ address_id ก็จะเปลี่ยนไปอยู่แล้ว มันก็ไม่ซ้ำกันอยู่แล้ว

Patient
Patient_ID = 1   
-----   
Address     
Address_ID = 2           
Detail = 5/30 ชลบุรี
-------
Address_ID = 23           
Detail = 3/20 ระยอง

-----
Patient_Address
Patient_ID = 1
Address_ID = 2
date_address_from = 2011-10-12
---------
Patient_ID = 1
Address_ID = 3
date_address_from = 2011-10-12


ในกรณีที่ซ้ำก็คือ user คนเดิม ดันที่อยู่เดียวกันซ้ำกัน 2 ครั้ง และเวลาเดียวกันด้วย
Patient
Patient_ID = 1   
-----   
Address     
Address_ID = 2           
Detail = 5/30 ชลบุรี
-------
Address_ID = 23           
Detail = 3/20 ระยอง

-----
Patient_Address
Patient_ID = 1
Address_ID = 2 <<<<<
date_address_from = 2011-10-12
---------
Patient_ID = 1
Address_ID = 2 <<<<<
date_address_from = 2011-10-12

ซึ่งมันก็ไม่น่าจะเป็นไปได้อยู่แล้ว เพราะเวลาคีย์ข้อมูลใหม่ address_id ก็เปลี่ยนทุกครั้ง

ผมจึงคิดไว้ว่า date_address_from น่าจะเอาไว้ใช้เก็บประวัติของที่อยู่หรือป่าว เพราะเมื่อเวลาเปลี่ยนไป ที่อยู่ของ user ก็เปลี่ยน จึงต้องมี
คอลั่ม date_address_from มาเก็บประวัติว่าเปลี่ยนที่อยู่ใหม่เมื่อไร แต่ผมก็ยังไม่เข้าใจอยู่ดีทำไมต้องทำ primary key เพื่อห้ามว้ำ
บันทึกการเข้า
*~เก้าคุง~*
สายตรวจเสียวบอร์ด
Moderator
เจ้าพ่อบอร์ดเสียว
*****

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

กระทู้: 4,097



ดูรายละเอียด
« ตอบ #11 เมื่อ: 29 ธันวาคม 2011, 00:32:53 »

อยากถามนอกคำถามอีกอันนึงครับคือ พวก field ที่ไม่ได้นำมาทำการคำนวณ เช่น รหัสบัตรประชาชน รหัสไปรษณีย์ เบอร์โทรศัพท์
หากผมจัดเก็บเป็น varchar กับ integer จะมีความแตกต่างกันมั้ยครับ เช่นขนาดการเก็บข้อมูฃ และความเร็วในการค้นหา โดยที่ไม่ได้เก็บ index ของ field เหล่านั้น
บันทึกการเข้า
gilbert
สมุนแก๊งเสียว
*

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

กระทู้: 713



ดูรายละเอียด
« ตอบ #12 เมื่อ: 29 ธันวาคม 2011, 00:46:42 »

อยากถามนอกคำถามอีกอันนึงครับคือ พวก field ที่ไม่ได้นำมาทำการคำนวณ เช่น รหัสบัตรประชาชน รหัสไปรษณีย์ เบอร์โทรศัพท์
หากผมจัดเก็บเป็น varchar กับ integer จะมีความแตกต่างกันมั้ยครับ เช่นขนาดการเก็บข้อมูฃ และความเร็วในการค้นหา โดยที่ไม่ได้เก็บ index ของ field เหล่านั้น

ตอบเรื่องปัญหาหลักนะครับ การเรียงข้อมูลมันจะไม่เหมือนกันเช่นข้อมูล 1 ถึง 10

ถ้าเป็น integer มันก็จะเรียงตามตัวเลขปกติ

แต่ถ้าเป็น varchar มันจะเรียงแบบนี้ครับ  1, 10 , 2 , 3 .....

สังเกตุว่ามันจะเอา 10 มาไว้อันดับ 2 แทนถ้าเป็น varchar 
บันทึกการเข้า
seowizard
หัวหน้าแก๊งเสียว
*

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

กระทู้: 1,119



ดูรายละเอียด เว็บไซต์
« ตอบ #13 เมื่อ: 29 ธันวาคม 2011, 08:30:48 »

date_address_from ผมก็ยังไม่ค่อยเข้าใจว่า ทำไมต้องห้ามข้อมูลซ้ำกัน คือสมมติเราคีย์ข้อมูลที่อยู่ลงไปใหม่ address_id ก็จะเปลี่ยนไปอยู่แล้ว มันก็ไม่ซ้ำกันอยู่แล้ว

Patient
Patient_ID = 1   
-----   
Address     
Address_ID = 2           
Detail = 5/30 ชลบุรี
-------
Address_ID = 23           
Detail = 3/20 ระยอง

-----
Patient_Address
Patient_ID = 1
Address_ID = 2
date_address_from = 2011-10-12
---------
Patient_ID = 1
Address_ID = 3
date_address_from = 2011-10-12


ในกรณีที่ซ้ำก็คือ user คนเดิม ดันที่อยู่เดียวกันซ้ำกัน 2 ครั้ง และเวลาเดียวกันด้วย
Patient
Patient_ID = 1   
-----   
Address     
Address_ID = 2           
Detail = 5/30 ชลบุรี
-------
Address_ID = 23           
Detail = 3/20 ระยอง

-----
Patient_Address
Patient_ID = 1
Address_ID = 2 <<<<<
date_address_from = 2011-10-12
---------
Patient_ID = 1
Address_ID = 2 <<<<<
date_address_from = 2011-10-12

ซึ่งมันก็ไม่น่าจะเป็นไปได้อยู่แล้ว เพราะเวลาคีย์ข้อมูลใหม่ address_id ก็เปลี่ยนทุกครั้ง

ผมจึงคิดไว้ว่า date_address_from น่าจะเอาไว้ใช้เก็บประวัติของที่อยู่หรือป่าว เพราะเมื่อเวลาเปลี่ยนไป ที่อยู่ของ user ก็เปลี่ยน จึงต้องมี
คอลั่ม date_address_from มาเก็บประวัติว่าเปลี่ยนที่อยู่ใหม่เมื่อไร แต่ผมก็ยังไม่เข้าใจอยู่ดีทำไมต้องทำ primary key เพื่อห้ามว้ำ

อาจจะเป็น datetime หรือ รูปแบบ date ที่ไม่ซ้ำนะครับ ไม่ใช่มีแค่วันที่ อาจจะมีชั่วโมง/นาที/วินาทีด้วยนะครับ ex: 2011-10-12:12-12-12
ก็เป็นไปได้ว่าเป็นการเก็บประวัติที่อยู่ผู้ป่วยนะครับ เพราะถ้าผู้ป่วยออกจากโรงพยาบาลไปแล้ว แล้วกลับเข้าโรงพยาบาลอีกครั้งก็อาจจะมีการเช็คว่าที่อยู่มีการเปลี่ยนแปลงไหม
ถ้ามีก็เพิ่ม record ใหม่เข้าไป รวมทั้งลงบันทึกวันที่ซึ่งเป็น PK ไปด้วย
บันทึกการเข้า
หน้า: [1]   ขึ้นบน
พิมพ์