ความต้องการใหม่ได้ปรากฏขึ้นบน codebase เก่าซึ่งโดยทั่วไปจะช่วยให้การสื่อสารโดยตรง (ภายใน) ระหว่างสองคลาสก่อนหน้านี้ไม่เกี่ยวข้องโดยตรงของผู้ใช้ (เก็บไว้ในตารางที่แตกต่างกับสคีมาที่แตกต่างกันโดยสิ้นเชิงและเศร้ารหัสแทบไม่ทราบ ออกแบบน้อยดังนั้นจึงไม่มีชั้นผู้ปกครอง) เนื่องจากเราออกไปแขวนกระเป๋าในการตั้งค่าแบบเก่าที่ไม่เคยพิจารณาฟังก์ชั่นนี้มาก่อนจึงไม่มีการรับประกันว่าจะไม่มีการชนกันของ PK - เนื่องจากชุดข้อมูลที่ใช้อยู่นั้นรับประกันว่าจะมี
ดังนั้นวิธีการแก้ปัญหาที่เห็นได้ชัด: ฆ่ามันด้วยไฟและเขียนตารางการทำแผนที่ทั้งหมดของระเบียบ ฉันได้รับสองทิศทางสำหรับวิธีที่เป็นไปได้ในการนำแผนที่ไปใช้ แต่ฉันไม่ใช่ DBA ดังนั้นฉันจึงไม่แน่ใจว่ามีข้อดีหรือข้อเสียใดที่ฉันพลาดไป
เพื่อความกระจ่างเกี่ยวกับสิ่งที่เป็นนามธรรมให้พิจารณาสามกลุ่มข้อมูลผู้ใช้ที่แตกต่างกัน: อาจารย์ผู้บริหารนักเรียน (ไม่นี่ไม่ใช่การบ้านที่ได้รับมอบหมายสัญญา!)
การทำแผนที่ 1
(Professor_id, admin_id และ student_id เป็นรหัสต่างประเทศในตารางที่เกี่ยวข้อง)
| mailing_id (KEY) | professor_id | admin_id | student_id |
-------------------------------------------------------
| 1001 | NULL | 87 | NULL |
| 1002 | 123 | NULL | NULL |
| 1003 | NULL | NULL | 123 |
+/- สำหรับวิธีนี้ดูเหมือนจะค่อนข้างหนักในข้อเสีย:
- สองฟิลด์ที่ "สูญเปล่า" ต่อแถว
- ละเมิด 2NF
- ช่องโหว่ในการแทรก / อัปเดตความผิดปกติ (แถวที่มีชุดฟิลด์ 0-1 เท่านั้น NULL เช่น)
ข้อดีไม่ได้โดยไม่ต้องมีข้อดีของตัวเองแม้ว่า:
- การแมปสามารถทำได้ด้วยการค้นหาเดียว
- กำหนดข้อมูล "แหล่งที่มา" ได้อย่างง่ายดายสำหรับผู้ใช้ที่กำหนดจาก mailing_id
ในความจริงของฉันจะบอกฉันไม่ชอบความคิดนี้เลย
การทำแผนที่ 2
(สมมติว่า MSG_ * เป็นค่าคงที่ประเภท enum หรือตัวระบุอื่นที่เหมาะสม)
| mailing_id (KEY) | user_type (UNIQUE1) | internal_id (UNIQUE2)|
------------------------------------------------------------------
| 1001 | MSG_ADMIN | 87 |
| 1002 | MSG_PROF | 123 |
| 1003 | MSG_STUDENT | 123 |
ด้วยการตั้งค่านี้และดัชนีคอมโพสิตที่เป็นเอกลักษณ์ของ {user_type, internal_id} ทุกอย่างกลายเป็นสิ่งที่สะอาดกว่าเดิม 3NF ได้รับการดูแลรักษาและรหัสแอปพลิเคชันไม่จำเป็นต้องตรวจสอบความผิดปกติของ I / U
ข้อเสียมีการสูญเสียความโปร่งใสเล็กน้อยในการพิจารณาตารางแหล่งผู้ใช้ที่ต้องจัดการนอกฐานข้อมูลซึ่งโดยทั่วไปเป็นจำนวนการแม็พระดับแอปพลิเคชันของค่า user_type กับตาราง ตอนนี้ฉัน (ค่อนข้างแรง) โน้มตัวไปยังการทำแผนที่ครั้งที่ 2 เนื่องจากข้อเสียค่อนข้างน้อย
แต่ฉันรู้ถึงข้อ จำกัด ของตัวเองอย่างเจ็บปวดและแน่ใจว่าฉันอาจพลาดข้อดีหรือสิ่งกีดขวางทั้งสองทิศทางดังนั้นฉันจึงหันไปใช้ความคิดที่ฉลาดกว่าของฉัน