私はマイケル・マクロスキーにある程度同意します。
私の頭の中にある質問は、複数のノートテーブルを持つことの技術的コストはどれくらいかということです。
私の考えでは、同じ機能を1つのテーブルに統合することが望ましいです。また、レポート作成やその他のさらなる開発が簡単になります。テーブルのリストを小さくして管理しやすくすることは言うまでもありません。
これはバランスをとる行為であり、このようなことを行うことのメリットとコストの両方を事前に決定する必要があります。私の個人的な好みは、データベースの参照整合性です。私の意見では、整合性のアプリケーション管理はビジネスロジックに限定されるべきです。データベースは、データが常に一貫性があり有効であることを保証する必要があります...
実際にあなたの質問に答えるために...
私が使用するオプションは、ユーザー定義関数を使用して値をチェックするチェック制約です。これはM$SQLServerで機能します...
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
その例では、最後の挿入ステートメントは失敗します。