อันนี้ผมคิดเองนะ
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()
ว่าเปลี่ยนที่อยู่หมดอายุเอาตรงวันนี้
ถูกผิดมึนยังไงก็ขออภัย

ปล. เคยเห็นใน stackoverflow