Sé que esta pregunta es antigua, pero ha recibido mucha atención a lo largo de los años y creo que le falta un concepto que pueda ayudar a alguien en un caso similar. Lo agrego aquí en aras de la integridad.
Si no puede modificar el esquema de su base de datos original, entonces se han proporcionado muchas buenas respuestas y resuelve el problema sin problemas.
Sin embargo, si puede modificar su esquema, le aconsejo que agregue un campo en su customer
tabla que contenga id
el último customer_data
registro de este 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
);
Consultar clientes
La consulta es tan fácil y rápida como puede 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 ...;
El inconveniente es la complejidad adicional al crear o actualizar un cliente.
Actualización de un cliente
Siempre que desee actualizar un cliente, inserte un nuevo registro en la customer_data
tabla y actualice el 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;
Creando un cliente
Crear un cliente es solo una cuestión de insertar la customer
entrada y luego ejecutar las mismas declaraciones:
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;
Terminando
La complejidad adicional para crear / actualizar un cliente puede ser temible, pero se puede automatizar fácilmente con activadores.
Finalmente, si está usando un ORM, esto puede ser muy fácil de administrar. El ORM puede encargarse de insertar los valores, actualizar los identificadores y unir las dos tablas automáticamente por usted.
Así es como Customer
se vería su modelo mutable :
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();
}
}
Y su CustomerData
modelo inmutable , que solo contiene captadores:
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;
}
}