Bu sorunun eski olduğunu biliyorum, ancak yıllar içinde çok dikkat çekti ve bence benzer bir durumda birine yardımcı olabilecek bir kavramı gözden kaçırıyor. Bütünlük uğruna onu buraya ekliyorum.
Orijinal veritabanı şemanızı değiştiremiyorsanız, birçok iyi yanıt verilmiştir ve sorunu gayet iyi çözebilirsiniz.
Eğer varsa olabilir , ancak, şemada değişiklik, senin bir alan eklemek tavsiye ediyorum customertutan tablonun iden geç customer_databu müşteri için rekor:
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
);
Müşterileri sorgulama
Sorgulama, olabildiğince kolay ve hızlıdır:
SELECT c.*, d.title, d.forename, d.surname
FROM customer c
INNER JOIN customer_data d on d.id = c.current_data_id
WHERE ...;
Bunun dezavantajı, bir müşteri oluştururken veya güncellerken ortaya çıkan ekstra karmaşıklıktır.
Bir müşteriyi güncelleme
Bir müşteriyi her güncellemek istediğinizde, customer_datatabloya yeni bir kayıt eklersiniz ve customerkaydı güncellersiniz .
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;
Bir müşteri yaratmak
Bir müşteri oluşturmak yalnızca customergirişi eklemek ve ardından aynı ifadeleri çalıştırmakla ilgilidir:
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;
Sarmak
Bir müşteri yaratmanın / güncellemenin ekstra karmaşıklığı korkutucu olabilir, ancak tetikleyicilerle kolayca otomatikleştirilebilir.
Son olarak, bir ORM kullanıyorsanız, bunu yönetmek gerçekten kolay olabilir. ORM sizin için değerlerin girilmesi, kimliklerin güncellenmesi ve iki tablonun otomatik olarak birleştirilmesiyle ilgilenebilir.
Değişken Customermodeliniz şöyle görünecektir:
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();
}
}
Ve CustomerDatasadece alıcıları içeren değişmez modeliniz:
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;
}
}