私はマイケルMcLosky、ある程度に同意します。
私の心の質問は:複数のノートテーブルを持つ技術的なコストはいくらですか?
私の考えでは、同じ機能を1つのテーブルに統合することをお勧めします。レポート作成やその他の開発が簡単になります。テーブルのリストを小さくして管理しやすくすることは言うまでもありません。
これはバランスの取れた行為であり、あなたはこのようなことをするコストとコストの両方をあらかじめ決めておく必要があります。 My -personal- preferenceは、データベースの参照整合性です。私の見解では、インテグリティのアプリケーション管理は、ビジネスロジックから除外されるべきです。データベースは、実際にあなたの質問に答えるために...データは常に一貫して有効である
を確実にしなければならない...私が使用する
オプションは、ユーザー定義を使用してチェック制約であります値をチェックする機能。これは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
この例では、最後の挿入ステートメントは失敗します。
データベースレベルの参照整合性が必要ですか、またはアプリケーション管理参照整合性を維持できますか? – tschaible