Я знаю, что этот вопрос старый, но с годами ему уделяется много внимания, и я думаю, что в нем отсутствует концепция, которая может помочь кому-то в аналогичном случае. Я добавляю это здесь для полноты картины.
Если вы не можете изменить свою исходную схему базы данных, то было дано много хороших ответов, и проблема решается просто отлично.
Если вы можете , однако, измените свою схему, я бы посоветовал добавить в вашу таблицу 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
модель, которая содержит только геттеры:
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;
}
}