ฉันรู้ว่าคำถามนี้เก่า แต่ได้รับความสนใจเป็นอย่างมากในช่วงหลายปีที่ผ่านมาและฉันคิดว่ามันขาดแนวคิดที่อาจช่วยใครบางคนในกรณีที่คล้ายกัน ฉันเพิ่มที่นี่เพื่อความสมบูรณ์
หากคุณไม่สามารถแก้ไขสคีมาฐานข้อมูลเดิมของคุณได้แสดงว่ามีคำตอบที่ดีมากมายและแก้ปัญหาได้ดี
อย่างไรก็ตามหากคุณสามารถแก้ไขสคีมาของคุณได้ฉันขอแนะนำให้เพิ่มฟิลด์ในcustomer
ตารางของคุณที่เก็บบันทึกid
ล่าสุดcustomer_data
สำหรับลูกค้ารายนี้:
CREATE TABLE customer (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
current_data_id INT UNSIGNED NULL DEFAULT NULL
);
CREATE TABLE customer_data (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
customer_id INT UNSIGNED NOT NULL,
title VARCHAR(10) NOT NULL,
forename VARCHAR(10) NOT NULL,
surname VARCHAR(10) NOT NULL
);
การสอบถามลูกค้า
การสืบค้นนั้นง่ายและรวดเร็วที่สุดเท่าที่จะทำได้:
SELECT c.*, d.title, d.forename, d.surname
FROM customer c
INNER JOIN customer_data d on d.id = c.current_data_id
WHERE ...;
ข้อเสียเปรียบคือความซับซ้อนเป็นพิเศษเมื่อสร้างหรืออัปเดตลูกค้า
การอัปเดตลูกค้า
เมื่อใดก็ตามที่คุณต้องการอัปเดตลูกค้าคุณต้องใส่ระเบียนใหม่ในcustomer_data
ตารางและอัปเดตcustomer
ระเบียน
INSERT INTO customer_data (customer_id, title, forename, surname) VALUES(2, 'Mr', 'John', 'Smith');
UPDATE customer SET current_data_id = LAST_INSERT_ID() WHERE id = 2;
การสร้างลูกค้า
การสร้างลูกค้าเป็นเพียงเรื่องของการแทรกcustomer
รายการจากนั้นเรียกใช้คำสั่งเดียวกัน:
INSERT INTO customer () VALUES ();
SET @customer_id = LAST_INSERT_ID();
INSERT INTO customer_data (customer_id, title, forename, surname) VALUES(@customer_id, 'Mr', 'John', 'Smith');
UPDATE customer SET current_data_id = LAST_INSERT_ID() WHERE id = @customer_id;
ห่อ
ความซับซ้อนพิเศษในการสร้าง / อัปเดตลูกค้าอาจเป็นเรื่องที่น่ากลัว แต่ก็สามารถทำให้เกิดโดยอัตโนมัติได้อย่างง่ายดายด้วยทริกเกอร์
สุดท้ายหากคุณใช้ ORM สิ่งนี้สามารถจัดการได้ง่ายมาก ORM สามารถดูแลการแทรกค่าอัปเดตรหัสและรวมสองตารางให้คุณโดยอัตโนมัติ
Customer
รูปแบบที่เปลี่ยนแปลงได้ของคุณจะมีลักษณะดังนี้:
class Customer
{
private int id;
private CustomerData currentData;
public Customer(String title, String forename, String surname)
{
this.update(title, forename, surname);
}
public void update(String title, String forename, String surname)
{
this.currentData = new CustomerData(this, title, forename, surname);
}
public String getTitle()
{
return this.currentData.getTitle();
}
public String getForename()
{
return this.currentData.getForename();
}
public String getSurname()
{
return this.currentData.getSurname();
}
}
และCustomerData
แบบจำลองที่ไม่เปลี่ยนรูปของคุณซึ่งมีเฉพาะ getters:
class CustomerData
{
private int id;
private Customer customer;
private String title;
private String forename;
private String surname;
public CustomerData(Customer customer, String title, String forename, String surname)
{
this.customer = customer;
this.title = title;
this.forename = forename;
this.surname = surname;
}
public String getTitle()
{
return this.title;
}
public String getForename()
{
return this.forename;
}
public String getSurname()
{
return this.surname;
}
}