Eindeutige Einschränkung mit ausgeschlossenen weichen Zeilen

7

Wir haben eine Tabelle mit einer eindeutigen Einschränkung für das Feedback, das von einem Benutzer hinterlassen wurde, für ein anderes, in Bezug auf einen Verkauf.

%Vor%

Dies stellt sicher, dass wir nicht versehentlich doppelte Zeilen von Feedback erhalten.

Momentan löschen wir manchmal das Feedback, das fälschlicherweise hinterlassen wurde, und lassen den Benutzer es wieder verlassen. Wir wollen zu soft-delete wechseln:

%Vor%

Wenn deleted_at IS NOT NULL ist, denke daran, dass das Feedback gelöscht wurde, obwohl wir immer noch den Audit-Trail in unserer Datenbank haben (und ihn wahrscheinlich den Admins der Site zeigen).

Wie können wir unsere einzigartige Einschränkung beibehalten, wenn wir so ein Soft-Delete verwenden? Ist es möglich, ohne eine allgemeinere CHECK() Einschränkung zu verwenden, wird eine Aggregatprüfung durchgeführt (ich habe noch nie versucht, eine Prüfbedingung wie diese zu verwenden).

Ich muss eine WHERE-Klausel an die Einschränkung anhängen.

    
d11wtq 06.11.2012, 22:28
quelle

2 Antworten

14

Ihr eindeutiger Index, der später herausgeschnitten wurde.

%Vor%

Ihr eindeutiger Index hat mindestens zwei Nebenwirkungen, die Ihnen möglicherweise Probleme bereiten.

  1. In anderen Tabellen können Sie keine Fremdschlüsseleinschränkung festlegen, die auf "Feedback" verweist. Eine Fremdschlüsselreferenz erfordert eine Kombination von Spalten, die entweder als primary key oder unique deklariert werden.
  2. Ihr eindeutiger Index ermöglicht mehrere Zeilen, die sich im Zeitstempel "deleted_at" nur von unterscheiden . Es ist also möglich , dass Zeilen mit dem folgenden Beispiel angezeigt werden. Ob dies ein Problem ist, hängt von der Anwendung ab.

Beispiel

%Vor%

PostgreSQL dokumentiert diese Art von Index als partiellen Index , wenn Sie es irgendwann einmal googeln müssen. Andere Plattformen verwenden unterschiedliche Begriffe dafür - gefilterter Index ist einer. Sie können die Probleme bis zu einem gewissen Grad mit einem Paar partieller Indizes begrenzen.

%Vor%

Aber Ich sehe keinen Grund, zu so viel Ärger zu gehen, besonders angesichts der möglichen Probleme mit Fremdschlüsseln. Wenn Ihr Tisch so aussieht

%Vor%

Dann brauchen Sie nur diese eindeutige Einschränkung für {user_id, subject_id, sale_id}. Sie könnten darüber hinaus in Erwägung ziehen, alle Löschungen die Spalte "deleted_at" zu verwenden, statt sie endgültig zu löschen.

    
Mike Sherrill 'Cat Recall' 06.11.2012, 23:04
quelle
6

Trotz der Tatsache, dass die PostgreSQL-Dokumentation davon abrät, einen eindeutigen Index anstelle einer Einschränkung zu verwenden (wenn der Punkt eine Einschränkung haben soll), scheint es, dass Sie

tun können %Vor%     
d11wtq 06.11.2012 23:03
quelle