Tôi biết câu hỏi này đã cũ, nhưng nó đã được chú ý rất nhiều trong những năm qua và tôi nghĩ rằng nó đang thiếu một khái niệm có thể giúp ích cho ai đó trong trường hợp tương tự. Tôi thêm nó ở đây vì lợi ích hoàn chỉnh.
Nếu bạn không thể sửa đổi lược đồ cơ sở dữ liệu ban đầu của mình, thì rất nhiều câu trả lời hay đã được cung cấp và giải quyết vấn đề tốt.
Tuy nhiên, nếu bạn có thể sửa đổi lược đồ của mình, tôi khuyên bạn nên thêm một trường trong customer
bảng của bạn để lưu giữ id
bản customer_data
ghi mới nhất cho khách hàng này:
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
);
Truy vấn khách hàng
Truy vấn dễ dàng và nhanh chóng nhất có thể:
SELECT c.*, d.title, d.forename, d.surname
FROM customer c
INNER JOIN customer_data d on d.id = c.current_data_id
WHERE ...;
Hạn chế là sự phức tạp thêm khi tạo hoặc cập nhật khách hàng.
Cập nhật khách hàng
Bất cứ khi nào bạn muốn cập nhật khách hàng, bạn chèn một bản ghi mới vào customer_data
bảng và cập nhật customer
bản ghi.
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;
Tạo khách hàng
Việc tạo khách hàng chỉ là việc chèn customer
mục nhập, sau đó chạy các câu lệnh tương tự:
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;
Kết thúc
Sự phức tạp thêm cho việc tạo / cập nhật khách hàng có thể đáng sợ, nhưng nó có thể dễ dàng được tự động hóa với các trình kích hoạt.
Cuối cùng, nếu bạn đang sử dụng ORM, điều này có thể thực sự dễ quản lý. ORM có thể đảm nhận việc chèn các giá trị, cập nhật id và tự động nối hai bảng cho bạn.
Đây là cách Customer
mô hình có thể thay đổi của bạn trông như thế nào:
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();
}
}
Và CustomerData
mô hình bất biến của bạn , chỉ chứa các 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;
}
}