Я согласен с Майклом Маклоски, в некоторой степени.
Вопрос в моей голове: какова техническая стоимость наличия нескольких таблиц заметок?
На мой взгляд, это предпочтительнееобъединить те же функции в одну таблицу. Это также упрощает отчетность и дальнейшее развитие. Не говоря уже о том, чтобы держать список таблиц меньше и проще в управлении.
Это уравновешивающее действие, вам нужно попытаться предопределить как преимущества, так и затраты, связанные с выполнением чего-либо подобного. Мои личные предпочтения - это ссылочная целостность базы данных. Управление целостностью приложений, на мой взгляд, должно быть ограничено бизнес-логикой. База данных должна гарантировать, что данные всегда согласованы и действительны ...
Чтобы ответить на ваш вопрос ...
Опция, которую я бы использовал, - это ограничение проверки с использованием определяемой пользователем функции для проверки значений. Это работает в 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
В этом примере завершающий оператор вставки потерпит неудачу.