So che questa domanda è vecchia, ma ha ricevuto molta attenzione nel corso degli anni e penso che manchi un concetto che possa aiutare qualcuno in un caso simile. Lo aggiungo qui per completezza.
Se non è possibile modificare lo schema del database originale, sono state fornite molte buone risposte e il problema è stato risolto perfettamente.
Se puoi , tuttavia, modificare il tuo schema, ti consiglio di aggiungere un campo nella tua customer
tabella che contiene id
l'ultimo customer_data
record per questo cliente:
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
);
Interrogare i clienti
La query è il più facile e veloce possibile:
SELECT c.*, d.title, d.forename, d.surname
FROM customer c
INNER JOIN customer_data d on d.id = c.current_data_id
WHERE ...;
Lo svantaggio è la complessità aggiuntiva durante la creazione o l'aggiornamento di un cliente.
Aggiornamento di un cliente
Ogni volta che desideri aggiornare un cliente, inserisci un nuovo record nella customer_data
tabella e aggiorna il customer
record.
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;
Creare un cliente
Creare un cliente è solo questione di inserire la customer
voce, quindi eseguire le stesse istruzioni:
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;
Avvolgendo
La complessità aggiuntiva per la creazione / aggiornamento di un cliente potrebbe essere spaventosa, ma può essere facilmente automatizzata con trigger.
Infine, se stai usando un ORM, questo può essere davvero facile da gestire. L'ORM può occuparsi di inserire i valori, aggiornare gli ID e unire automaticamente le due tabelle.
Ecco come Customer
apparirebbe il tuo modello mutevole :
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();
}
}
E il tuo CustomerData
modello immutabile , che contiene solo 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;
}
}