Benny: Microsoft SQL Server Duplikate vermeiden

Hi.

Ich schreibe gerade eine kleine ASP.NET MVC Anwendung.
Es geht um eine Kontakverwaltung. Das DB Schema steht und die ersten Einträge kann ich bereits über die Anwendung in der DB speichern. Jetzt würde ich gerne die Erstellung von Duplikaten vermeiden. Wie stellt man das an? Spontan würde ich mir alle EInträge der DB besorgen und mit dem neu zu erstellenden Datensatz vergleichen. Sind 2 Einträge identisch, haben wir ein Duplikat. Wird das so gemacht oder gibt es da andere Vorgehensweisen?

Vielen Dank euch schlauen Köpfen und liebe Grüße

  1. Hi!

    Jetzt würde ich gerne die Erstellung von Duplikaten vermeiden. Wie stellt man das an?

    Mit einem Unique Index.

    Spontan würde ich mir alle EInträge der DB besorgen und mit dem neu zu erstellenden Datensatz vergleichen. Sind 2 Einträge identisch, haben wir ein Duplikat. Wird das so gemacht oder gibt es da andere Vorgehensweisen?

    Ungünstig in Multi-User-Umgebungen. Während der eine die Liste auswertet, trägt sich der andere grad ein. Der eine ist fertig und trägt sich nun auch ein => Duplikat. Beim Unique Index trägt man einfach ein. Kommt kein Fehler, war alles bestens. Gibt es eine Unique-Constraint-Verletzung, gab es die Werte schon.

    Lo!

    1. Vielen Dank schon mal für die Antworten.
      Hatte gestern leider keine Gelegenheit mehr ins Internet zu gehen. Die Wahl fällt also auf einen Unique Index. Wie definiert man das und erfolgt die Duplikatsprüfung dann automatisch von der DB oder muss ich sie selbst durchführen?

      LG

      Hi!

      Jetzt würde ich gerne die Erstellung von Duplikaten vermeiden. Wie stellt man das an?

      Mit einem Unique Index.

      Spontan würde ich mir alle EInträge der DB besorgen und mit dem neu zu erstellenden Datensatz vergleichen. Sind 2 Einträge identisch, haben wir ein Duplikat. Wird das so gemacht oder gibt es da andere Vorgehensweisen?

      Ungünstig in Multi-User-Umgebungen. Während der eine die Liste auswertet, trägt sich der andere grad ein. Der eine ist fertig und trägt sich nun auch ein => Duplikat. Beim Unique Index trägt man einfach ein. Kommt kein Fehler, war alles bestens. Gibt es eine Unique-Constraint-Verletzung, gab es die Werte schon.

      Lo!

      1. Hi!

        Die Wahl fällt also auf einen Unique Index. Wie definiert man das und erfolgt die Duplikatsprüfung dann automatisch von der DB oder muss ich sie selbst durchführen?

        Ein Unique Index ist ein Feature, mit dem das DBMS die Eindeutigkeit garantiert. Du kümmerst dich nicht weiter drum als einfach zu schreiben und dabei auf Unique Constraint Fehler zu achten (und sie von anderen Fehlermeldungen zu unterscheiden). Den Index definiert man in dem Dialog, in dem man auch alle anderen Indexe definiert.

        Lo!

        1. Hm. Also ich hab jetzt mal etwas nach Unique Constraints geschaut. Einen solchen Constraint für eine Tabelle zu definieren scheint ja nicht schwer zu sein. Allerdings hängt die Duplikatprüfung bei mir von 2 Tabellen ab. Also wenn 2 Attribute aus Tabelle 1 und 2 aus Tabelle 2 in dieser Kombination schon vorhanden sind, liegt ein Duplikat vor. Hab bisher nichts gefunden um dies zu modelieren.

          Hi!

          Die Wahl fällt also auf einen Unique Index. Wie definiert man das und erfolgt die Duplikatsprüfung dann automatisch von der DB oder muss ich sie selbst durchführen?

          Ein Unique Index ist ein Feature, mit dem das DBMS die Eindeutigkeit garantiert. Du kümmerst dich nicht weiter drum als einfach zu schreiben und dabei auf Unique Constraint Fehler zu achten (und sie von anderen Fehlermeldungen zu unterscheiden). Den Index definiert man in dem Dialog, in dem man auch alle anderen Indexe definiert.

          Lo!

          1. Hi!

            Bitte zitiere nicht im TOFU-Stil. Danke.

            Also wenn 2 Attribute aus Tabelle 1 und 2 aus Tabelle 2 in dieser Kombination schon vorhanden sind, liegt ein Duplikat vor. Hab bisher nichts gefunden um dies zu modelieren.

            Das geht nach meinem Wissensstand auch nicht tabellenübergreifend. Eine Lösung wäre, diese beiden Werte in einer dritten Tabelle zu führen und in den beiden anderen nur einen Verweis darauf.

            Lo!

          2. Hallo,

            vorab ... dein Problem hat nichts mit der Wahl einer bestimmten Datenbanksoftware zu tun, sondern es ist ein logisches bzw. Design Problem.

            Ein Unique Constraint ist eine rein technische Angelegenheit, welche die Eindeutigkeit eines Datensatzes in seinem Gültigkeitsbereich (Tabelle) sicherstellt. Der Primary Key in einer Tabelle ist z.b. eindeutig.

            Also wenn 2 Attribute aus Tabelle 1 und 2 aus Tabelle 2 in dieser Kombination schon vorhanden sind, liegt ein Duplikat vor.

            Dies ist eine von dir definierte Logik, welche über die Funktion und Möglichkeiten eines Unique Constraints hinausgeht. Du benötigst demnach auch eine von dir definierte und korrespondierende Logik zur Feststellung von Duplikaten.

            Eine Möglichkeit wäre:

            • im Hintergrund wird eine Schattentabelle in einer denormalisierten Form geführt (von dedlfix schon angemerkt)
            • auf dieser Tabelle könnte dann ein Unique Constraint implementiert werden
            • durch Trigger (soweit von der Datenbanksoftware unterstützt) auf den originalen normalisierten Tabellen einen Eintrag in diese Schattentabelle zu machen (alternativ kann man das natürlich auch über Stored Procedures machen)
            • sollte das Insert auf der Schattentabelle fehlschlagen, sollten die Trigger / Procedures eine Logik beinhalten die Änderungen auf den originalen Tabellen rückgängig zu machen (Transaktionen böten sich da an) und den Fehler weiter nach oben zu geben (bei dir an das ASP.Net MVC Gerassel)

            Natürlich hat diese Vorgehensweise ggf nachteiligen Einfluss auf

            • Performance
            • Datenwachstum

            Ciao, Frnk

  2. Bestehender Datensatz:

    Ralf | Müller | Musterstraße | 135 | 1234 | Musterhausen

    Neuer Datensatz:

    Ralf | Mueller | Musterstraße | 135 | 1234 | Musterhausen

    Duplikat?