Tôi đồng ý với Michael McLosky, ở một mức độ.
Câu hỏi trong đầu tôi là: Chi phí kỹ thuật của việc có nhiều bảng ghi chú là gì?
Trong suy nghĩ của tôi, Tốt hơn là nên hợp nhất cùng một chức năng vào một bảng. Nó làm cho báo cáo và phát triển hơn nữa đơn giản hơn. Chưa kể đến việc giữ danh sách các bảng nhỏ hơn và dễ quản lý hơn.
Đó là một hành động cân bằng, bạn cần phải cố gắng xác định trước cả lợi ích và chi phí làm một cái gì đó như thế này. Tùy chọn -personal- của tôi là toàn vẹn tham chiếu cơ sở dữ liệu. Ứng dụng quản lý tính toàn vẹn nên, theo ý kiến của tôi, được giới hạn ot logic kinh doanh. Cơ sở dữ liệu nên đảm bảo dữ liệu luôn luôn là nhất quán và hợp lệ ...
Để thực sự trả lời câu hỏi của bạn ...
Tùy chọn Tôi sẽ sử dụng là một hạn chế kiểm tra sử dụng một User Defined Chức năng kiểm tra các giá trị. Điều này hoạt động trong M $ SQL Server ...
CREATE TABLE Test_Table_1 (id INT IDENTITY(1,1), val INT)
GO
CREATE TABLE Test_Table_2 (id INT IDENTITY(1,1), val INT)
GO
CREATE TABLE Test_Table_3 (fk_id INT, table_name VARCHAR(64))
GO
CREATE FUNCTION id_exists (@id INT, @table_name VARCHAR(64))
RETURNS INT
AS
BEGIN
IF (@table_name = 'Test_Table_1')
IF EXISTS(SELECT * FROM Test_Table_1 WHERE id = @id)
RETURN 1
ELSE
IF (@table_name = 'Test_Table_2')
IF EXISTS(SELECT * FROM Test_Table_2 WHERE id = @id)
RETURN 1
RETURN 0
END
GO
ALTER TABLE Test_Table_3 WITH CHECK ADD CONSTRAINT
CK_Test_Table_3 CHECK ((dbo.id_exists(fk_id,table_name)=(1)))
GO
ALTER TABLE [dbo].[Test_Table_3] CHECK CONSTRAINT [CK_Test_Table_3]
GO
INSERT INTO Test_Table_1 SELECT 1
GO
INSERT INTO Test_Table_1 SELECT 2
GO
INSERT INTO Test_Table_1 SELECT 3
GO
INSERT INTO Test_Table_2 SELECT 1
GO
INSERT INTO Test_Table_2 SELECT 2
GO
INSERT INTO Test_Table_3 SELECT 3, 'Test_Table_1'
GO
INSERT INTO Test_Table_3 SELECT 3, 'Test_Table_2'
GO
Trong ví dụ này, câu lệnh chèn cuối cùng sẽ thất bại.
Yêu cầu tính toàn vẹn tham chiếu cấp cơ sở dữ liệu hay bạn có thể sống với tính toàn vẹn tham chiếu được quản lý của ứng dụng không? – tschaible