Một cách để giải quyết vấn đề này là thêm một bảng vào cơ sở dữ liệu của bạn để hoạt động như một cơ sở cho các bảng khác và kết nối nó với mối quan hệ 1-1 với các bảng khác, sau đó kết nối bảng sự kiện với bảng cơ sở này.
Điều này sẽ cho phép bạn giữ toàn vẹn dữ liệu cho từng bảng.
Bảng cơ sở có thể đơn giản chỉ là một cột hoặc có thể có các cột thay cho tất cả các bảng khác có điểm chung, do đó thực hiện kiểu " kế thừa "trong cấu trúc dữ liệu của bạn.
Tạo bảng cơ sở (giả sử không có cột chung giữa các bảng khác):
CREATE TABLE TblObjectBase
(
ObjectBase_Id int IDENTITY(1,1) PRIMARY KEY
)
Sau đó, đối với bất kỳ bảng nào khác cần được tham chiếu bởi ObjectId
trong Events
bảng:
CREATE TABLE TblClients
(
Client_Id int PRIMARY KEY,
Client_FirstName varchar(10),
Client_LastName varchar(10),
-- Other client related data
CONSTRAINT FK_TblClients_TblObjectBase
FOREIGN KEY(Client_Id)
REFERENCES TblObjectBase(ObjectBase_Id)
)
CREATE TABLE TblInvoices
(
Invoice_Id int PRIMARY KEY,
-- other incoice related data
CONSTRAINT FK_TblInvoices_TblObjectBase
FOREIGN KEY(Invoice_Id)
REFERENCES TblObjectBase(ObjectBase_Id)
)
Điều duy nhất còn lại là chèn một giá trị mới vào TblObjectBase cho bất kỳ lần chèn nào trên các bảng khác của bạn. Điều này có thể dễ dàng đạt được bằng các thủ tục được lưu trữ hoặc thay vì trình kích hoạt chèn.
Thủ tục chèn có thể trông giống như sau:
CREATE PROCEDURE Insert_TblClients
(
@Client_FirstName varchar(10),
@Client_LastName varchar(10),
-- any other client related data you might have
)
AS
DECLARE @ClientId int
-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;
-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();
-- Insert the data to the clients table:
INSERT INTO TblClients
(Client_Id, Client_FirstName, Client_LastName.....) VALUES
(@ClientId, @Client_FirstName, @Client_LastName...)
Một trình kích hoạt thay vì chèn sẽ trông giống như sau:
CREATE TRIGGER TblClients_IO_Insert ON TblClients INSTEAD OF INSERT
AS
BEGIN
DECLARE @ClientId int
-- Insert a new record to the base table:
INSERT INTO TblObjectBase DEFAULT VALUES;
-- Get the id you've just inserted:
SELECT @ClientId = SCOPE_IDENTITY();
INSERT INTO TblClients
(Client_Id, Client_FirstName, Client_LastName.....)
SELECT @ClientId, Client_FirstName, Client_LastName.....
FROM inserted
END
Nếu bạn chọn sử dụng thay vì chèn, thực tế là giá trị Danh tính đến từ một bảng khác phải minh bạch đối với khách hàng (chương trình vb.net của bạn).