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.
Ihr eindeutiger Index, der später herausgeschnitten wurde.
%Vor%Ihr eindeutiger Index hat mindestens zwei Nebenwirkungen, die Ihnen möglicherweise Probleme bereiten.
primary key
oder unique
deklariert werden. 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.
Tags und Links postgresql database-design constraints