複数のテーブルに一意の制約を作成しようとしています。同様の質問がここで回答されているのを見つけましたが、それらは私がやろうとしていることの精神を完全には捉えていません。
例として、t_Analog、t_Discrete、t_Message の 3 つのテーブルがあります。
CREATE TABLE t_Analog(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [float] NOT NULL,
CONSTRAINT [uc_t_Analog] UNIQUE(AppName, ItemName)
)
CREATE TABLE t_Discrete(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [bit] NOT NULL,
CONSTRAINT [uc_t_Discrete] UNIQUE(AppName, ItemName)
)
CREATE TABLE t_Message(
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
[Value] [nvarchar](256) NOT NULL,
CONSTRAINT [uc_t_Message] UNIQUE(AppName, ItemName)
)
私の目標は、AppName と ItemName を 3 つのテーブルすべてで一意にすることです。たとえば、アプリケーション X のアイテム名 Y は、アナログ テーブルとディスクリート テーブルの両方に存在することはできません。
この例は不自然であることに注意してください。各 Type の実際のデータは異なり、テーブルを結合して Type 列を追加するには十分な大きさです。
これに対するアプローチについて何か提案があれば、ぜひ聞かせてください!
---- 編集開始 2012-04-26 13:28 CST ----
回答ありがとうございます。
このデータベースのスキーマを変更する原因があるようですが、それで問題ありません。
テーブルを 1 つのテーブルに結合することは、実際には実行可能なオプションではありません。タイプごとに一致しない列が 30 程度あるためです (残念ながら、これらの列を変更することはオプションではありません)。これにより、列の大きなセクションが各行で使用されない可能性があり、これは悪い考えのように思えます。
John Sikora や他の人が言及しているように、4 番目のテーブルを追加することはオプションかもしれませんが、最初にこれを確認したいと思います。
スキーマを次のように変更します。
CREATE TABLE t_AllItems(
[id] [bigint] IDENTITY(1,1) NOT NULL,
[itemType] [int] NOT NULL,
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
CONSTRAINT [pk_t_AllItems] PRIMARY KEY CLUSTERED ( [id] )
CONSTRAINT [uc_t_AllItems] UNIQUE([id], [AppName], [ItemName])
) ON [PRIMARY]
CREATE TABLE t_Analog(
[itemId] [bigint] NOT NULL,
[Value] [float] NOT NULL,
FOREIGN KEY (itemId) REFERENCES t_AllItems(id)
)
CREATE TABLE t_Discrete(
[itemId] [bigint] NOT NULL,
[Value] [bit] NOT NULL,
FOREIGN KEY (itemId) REFERENCES t_AllItems(id)
)
CREATE TABLE t_Message(
[itemId] [bigint] NOT NULL,
[Value] [nvarchar](256) NOT NULL,
FOREIGN KEY (itemId) REFERENCES t_AllItems(id)
)
このアプローチに関して 1 つだけ質問があります。これにより、サブテーブル全体で一意性が強制されますか?
たとえば、テーブル t_Analog の 'itemId' が 9 で 'value' が 9.3 の 'id' 9 を持つ 'Item' が存在し、同時に t_Message の 'itemId' 9 と 'Value' が「フ」?
この余分なテーブルのアプローチを完全には理解していないかもしれませんが、反対ではありません。
これについて間違っている場合は修正してください。