Sei que essa pergunta é antiga, mas tem recebido muita atenção ao longo dos anos e acho que está faltando um conceito que pode ajudar alguém em um caso semelhante. Estou adicionando aqui para fins de integridade.
Se você não pode modificar o esquema do banco de dados original, então várias boas respostas foram fornecidas e resolvem o problema perfeitamente.
Se você puder , no entanto, modificar seu esquema, aconselho adicionar um campo em sua customer
tabela que contenha o id
do último customer_data
registro deste 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
);
Consultando clientes
Consultar é tão fácil e rápido quanto pode ser:
SELECT c.*, d.title, d.forename, d.surname
FROM customer c
INNER JOIN customer_data d on d.id = c.current_data_id
WHERE ...;
A desvantagem é a complexidade extra ao criar ou atualizar um cliente.
Atualizando um cliente
Sempre que você deseja atualizar um cliente, você insere um novo registro na customer_data
tabela e atualiza o customer
registro.
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;
Criação de um cliente
Criar um cliente é apenas uma questão de inserir a customer
entrada e, em seguida, executar as mesmas instruções:
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;
Empacotando
A complexidade extra para criar / atualizar um cliente pode ser assustadora, mas pode ser facilmente automatizada com gatilhos.
Finalmente, se você estiver usando um ORM, isso pode ser muito fácil de gerenciar. O ORM pode se encarregar de inserir os valores, atualizar os ids e juntar as duas tabelas automaticamente para você.
Esta é a aparência do seu Customer
modelo mutável :
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 seu CustomerData
modelo imutável , que contém apenas 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;
}
}