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