Saya tahu pertanyaan ini sudah lama, tetapi mendapat banyak perhatian selama bertahun-tahun dan saya pikir itu kehilangan konsep yang dapat membantu seseorang dalam kasus serupa. Saya menambahkannya di sini demi kelengkapan.
Jika Anda tidak dapat mengubah skema database asli Anda, maka banyak jawaban bagus telah disediakan dan menyelesaikan masalah dengan baik.
Namun, jika Anda dapat mengubah skema, saya sarankan untuk menambahkan bidang di customer
tabel Anda yang menyimpan rekor id
terbaru customer_data
untuk pelanggan ini:
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
);
Menanyakan pelanggan
Membuat kueri semudah dan secepat mungkin:
SELECT c.*, d.title, d.forename, d.surname
FROM customer c
INNER JOIN customer_data d on d.id = c.current_data_id
WHERE ...;
Kekurangannya adalah kerumitan ekstra saat membuat atau memperbarui pelanggan.
Memperbarui pelanggan
Setiap kali Anda ingin memperbarui pelanggan, Anda memasukkan catatan baru di customer_data
tabel, dan memperbarui customer
catatan.
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;
Menciptakan pelanggan
Membuat pelanggan hanyalah masalah memasukkan customer
entri, lalu menjalankan pernyataan yang sama:
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;
Membungkus
Kompleksitas ekstra untuk membuat / memperbarui pelanggan mungkin menakutkan, tetapi dapat dengan mudah diotomatiskan dengan pemicu.
Terakhir, jika Anda menggunakan ORM, ini bisa sangat mudah dikelola. ORM dapat menangani penyisipan nilai, memperbarui id, dan menggabungkan dua tabel secara otomatis untuk Anda.
Berikut adalah tampilan Customer
model Anda yang bisa berubah :
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();
}
}
Dan CustomerData
model Anda yang tidak dapat diubah , yang hanya berisi getter:
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;
}
}