2017-12-23 1 views
1

Ich habe eine 'MasterDetail' Tabelle mit Spalten ID, Schlüssel, ItemName. Ich behalte alle in meiner Anwendung verwendeten Enum-Werte in dieser einzigen Tabelle. z.B.Wertbasierte Fremdschlüssel in SQL Server

  1. geschlossen, StatusEnum
  2. In Progress, StatusEnum
  3. ScreenA, ScreenEnum
  4. Halten, StatusEnum

Ich habe eine andere Tabelle mit einem der Spalte als -Status 'Order' sagen, die auf diese Tabelle für StatusEnum-Werte verweisen. Ich möchte, dass diese Tabelle 'Order' nur auf die Werte 1,2,4 aus der Tabelle 'MasterDetail' verweist, aber nicht auf den Wert 3, da dies der ScreenEnum-Wert ist.

Ich benutze SQL Server 2016. Irgendwelche Gedanken bitte.

+0

Dank @Gordon für die verbesserte Formatierung – knowdotnet

Antwort

1

Wenn ich richtig verstehe, können Sie eine generierte Spalte verwenden den Elementtyp Informationen zu behalten:

create table MasterDetail (
    Id int identity(1, 1) primary key, 
    Key varchar(255) unique, 
    ItemName varchar(255), 
    constraint unq_masterdetail_key_ItemName unique (key, ItemName) 
); 

create table orders (
    OrderId int identity(1, 1) primary key, 
    Key varchar(255), 
    . . . 
    StatusEnum as ('StatusEnum') persisted, 
    constraint foreign key fk_orders_key_statusenum (key, statusenum) references masterdetail(key, itemname) 
); 

Beachten Sie, dass die eindeutige Einschränkung in MasterDetail redundant ist. Aber es erlaubt eine Fremdschlüsselbeziehung, sich auf das Paar key/itemname zu beziehen. Das ist das, was benötigt wird, 1 Arten zu erhalten, 2, 4, aber nicht 3.

0

Mit diesem Design, müssen Sie die folgenden referenzielle Integrität zu erzwingen:

  • hinzufügen ItemName Spalte an nahe stehende Tabelle (s)
  • eine zusammengesetzte eindeutige Einschränkung auf Masterdetail Schlüssel hinzufügen und ItemName (oder, dass der Primärschlüssel)
  • einen Verbundfremdschlüssel an nahe stehende Tabelle (n) hinzufügen könnte

Alternativ begrenzen lassen Werte mit einer Beschränkung auf Spaltenebene prüfen, die eine Teilmenge der MasterDetail-Werte ist.

Ich empfehle in der Regel separate Tabellen für jede "enum", wenn Sie referentielle Integrität erzwingen wollen. Obwohl das mehr Tabellen erfordert, ist das Design ein bisschen sauberer, IMHO.

Verwandte Themen