Aggiungi una quarta tabella specifica per questi valori che vuoi essere univoco, quindi collega queste chiavi da questa tabella alle altre usando una relazione uno a molti. Ad esempio avrai la tabella univoca con un ID, AppName e ItemName per creare i suoi 3 colonne. Quindi fai in modo che questa tabella sia collegata alle altre.
Per come farlo, ecco un buon esempioCrea una relazione uno a molti usando SQL Server
MODIFICA: Questo è quello che farei, ma considerando le esigenze del tuo server puoi cambiare ciò che è necessario:
CREATE TABLE AllItems(
[id] [int] IDENTITY(1,1) NOT NULL,
[itemType] [int] NOT NULL,
[AppName] [nvarchar](20) NOT NULL,
[ItemName] [nvarchar](32) NOT NULL,
CONSTRAINT [pk_AllItems] PRIMARY KEY CLUSTERED ( [id] ASC )
) ON [PRIMARY]
CREATE TABLE Analog(
[itemId] [int] NOT NULL,
[Value] [float] NOT NULL
)
CREATE TABLE Discrete(
[itemId] [int] NOT NULL,
[Value] [bit] NOT NULL
)
CREATE TABLE Message(
[itemId] [bigint] NOT NULL,
[Value] [nvarchar](256) NOT NULL
)
ALTER TABLE [Analog] WITH CHECK
ADD CONSTRAINT [FK_Analog_AllItems] FOREIGN KEY([itemId])
REFERENCES [AllItems] ([id])
GO
ALTER TABLE [Analog] CHECK CONSTRAINT [FK_Analog_AllItems]
GO
ALTER TABLE [Discrete] WITH CHECK
ADD CONSTRAINT [FK_Discrete_AllItems] FOREIGN KEY([itemId])
REFERENCES [AllItems] ([id])
GO
ALTER TABLE [Discrete] CHECK CONSTRAINT [FK_Discrete_AllItems]
GO
ALTER TABLE [Message] WITH CHECK
ADD CONSTRAINT [FK_Message_AllItems] FOREIGN KEY([itemId])
REFERENCES [AllItems] ([id])
GO
ALTER TABLE [Message] CHECK CONSTRAINT [FK_Message_AllItems]
GO
Da quello che posso dire che la tua sintassi va bene, l'ho semplicemente cambiata in questo modo semplicemente perché ho più familiarità con essa, ma entrambi dovrebbero funzionare.