2017-08-16 3 views
0

Ich habe ein Attribut A und damit eine Tabelle A beziehen:Datenbank-Design - Markiert Felder

ID Name OtherFields isPrimary 
1 foo  stuff   1 
2 bar  stuff   0 
3 blah  stuff   0 
4 blahh stuff   0 

Die IsPrimary Spalte eine Zeile als primäre markiert. Nur eine Zeile kann primär sein und es muss immer eine Zeile als primärer Wert festgelegt werden.

Was ist der beste Weg, um dies auf Datenbankebene durchzusetzen?

Wäre die beste Methode, eine neue Tabelle namens Primary zu erstellen, die eine Spalte hat, ID, die ein Fremdschlüssel wäre, der auf A.ID verweist?

alternativ kann ich mithilfe der oben beschriebenen Tabellenstruktur erzwingen, dass nicht mehr als eine Zeile mit einem eindeutigen Index auf 1 gesetzt wird. Ich bin mir jedoch nicht sicher, wie sichergestellt werden kann, dass nicht weniger als eine Zeile gesetzt ist als 1

ich benutze MS SQL Server

+0

Es scheint mir die erste Lösung (Tabelle Primary) ist die bessere sowohl für die Einfachheit als auch die Effizienz der Durchsetzung, und auch für die Einfachheit der Programmierung. – Renzo

Antwort

0

Ich würde eine neue Tabelle erstellen. Ich schlage vor, Sie nennen es nicht PRIMÄR, weil das ein reserviertes Wort ist. Sie sollten auch Einschränkungen berücksichtigen, um sicherzustellen, dass es nicht mehr als eine Zeile hat. Beispiel:

0

Sie können mit "Check"

CHECK (IsValid(isPrimary) = 'True') 

und IsValid() wie ...

CREATE FUNCTION IsValid(
    @Tmp VARCHAR(1) 
) 
RETURNS VARCHAR(5) 
AS 
BEGIN 
    IF EXISTS (SELECT * FROM Table WHERE isPrimary = 1) 
     return 'False' 
    return 'True' 
END 

Daher kann es nicht neue Zeile einzufügen, die IsPrimary 0, bis alle IsPrimary der Zeile 0 ist

+0

Vorsicht. Diese CHECK-Einschränkung funktioniert nicht wie erwartet, wenn mehr als eine Zeile in einer einzelnen Aktualisierung aktualisiert wird. – sqlvogel