Tools zum Erkennen von De-facto-Fremdschlüsseln in Datenbanken? [geschlossen]

8

Eine gute Möglichkeit, die Informationen in einer Datenbank schnell zu erfassen, besteht darin, ein Werkzeug anzuwenden, das automatisch ein Datenbankdiagramm aller Tabellen und aller Beziehungen zwischen ihnen erstellt.

Meiner Erfahrung nach verwenden solche Tools Fremdschlüssel als Beziehungen, die die meisten Datenbanken, die ich versuche, nicht enthalten. Sicher, sie erfüllen Einschränkungen, die Fremdschlüsseln entsprechen, setzen sie jedoch nicht durch. Und ich werde am Ende ein "Diagramm" haben, das aus einer Reihe von nicht zusammenhängenden Tabellen besteht.

Nach was ich suche, ist Software, die "undeclared Fremdschlüssel" und entweder

berechnen kann
  • verwendet sie als Tabellenrelationen in einem Datenbankdiagramm oder
  • generiert SQL-Code für entsprechende Fremdschlüsseldeklarationen

Kennst du irgendwelche Werkzeuge, die wenn möglich frei sind, die das schon tun können?

    
reinierpost 11.08.2011, 18:48
quelle

4 Antworten

4

Interessante Frage. Sie möchten ein Datenbankschema und Daten analysieren, um festzustellen, welche Tabellen relevant sind oder miteinander in Beziehung stehen sollten, ohne dass eine strikte Definition der Beziehung erforderlich ist. In der Tat versuchen Sie, eine Beziehung abzuleiten.

Ich sehe zwei Möglichkeiten, wie Sie auf eine solche Beziehung schließen können. Lassen Sie mich zunächst sagen, dass Ihr Ansatz abhängig von den Datenbanken, mit denen Sie arbeiten, variieren kann. Eine Reihe von Fragen fällt mir ein (ich will keine Antworten, aber sie sind es wert, darüber nachzudenken)

  • sind diese unternehmensinternen Systeme, die einigen konsistenten Namenskonventionen oder Mustern folgen?
  • oder sind sie "in-the-wild" -Datenbanken, auf die Sie jederzeit und überall stoßen?
  • Welche Art von Annahmen sind Sie bereit zu machen?
  • würden Sie es bevorzugen, mehr falsche positive oder falsche negative Ergebnisse in Ihrem Ergebnis zu bekommen?

Beachten Sie, dass diese Schlussfolgerung mit ziemlicher Sicherheit falsche Ergebnisse liefert und auf einer Reihe von Annahmen beruht.

Also biete ich zwei Ansätze an, die ich im Konzert verwenden würde.

Übertragung einer Beziehung durch Struktur / Benennung (symbolische Analyse)

Der allgemeine Datenbankentwurf besteht darin, eine PK-Spalte nach dem Tabellennamen zu benennen (z. B. CustomerId in Tabelle Customer ) oder alternativ die PK-Spalte einfach mit Id zu benennen.

Eine Tabelle mit einer FK-Beziehung zu einer anderen benennt die zugehörige Spalte oft genauso wie die zugehörige Tabelle. In der Tabelle Order würde ich eine Spalte CustomerId erwarten, die sich auf die Spalte CustomerId / Id in der Tabelle Customer bezieht.

Diese Art der Analyse würde

beinhalten
  • Überprüfung von Spalten in Tabellen auf ähnliche Ausdrücke / Wörter
  • sucht nach Spaltennamen, die den Namen anderer Tabellen ähnlich sind
  • Prüfung auf Spaltennamen, die den Namen einer anderen Spalte enthalten (z. B. FirstCustomerId & amp; SecondCustomerId beziehen sich beide auf die Spalte CustomerId in der Tabelle Customer )

Übertragung einer Beziehung durch Daten (statistische Analyse)

Wenn Sie Daten betrachten, wie Sie es in Ihren Kommentaren vorgeschlagen haben, können Sie "mögliche" Referenzen ermitteln. Wenn die Spalte CustomerId in der Tabelle Order Werte enthält, die nicht in der Spalte Id der Tabelle Customer vorhanden sind, dann ist es sinnvoll zu bezweifeln, dass dies eine gültige Beziehung ist (obwohl Sie es nie wissen!)

Eine einfache Form der Datenanalyse verwendet Daten und Zeiten. Zeilen, die in enger Nachbarschaft zueinander erstellt wurden, sind eher miteinander verwandt. Wenn für jede Order -Zeile, die erstellt wurde, auch zwischen 2 und 5 Item -Zeilen vorhanden sind, die innerhalb weniger Sekunden erstellt wurden, ist wahrscheinlich eine Beziehung zwischen beiden gegeben.

Eine detailliertere Analyse könnte sich den Bereich und die Verteilung der verwendeten Werte ansehen.

Beispiel: Wenn Ihre Order -Tabelle eine St_Id -Spalte hat, könnten Sie aus der symbolischen Analyse schließen, dass sich die Spalte wahrscheinlich auf eine State -Tabelle oder eine Status -Tabelle bezieht. Die Spalte St_Id hat 6 diskrete Werte und 90% der Datensätze werden durch 2 Werte abgedeckt. Die Tabelle State hat 200 Zeilen und die Tabelle Status hat 9 Zeilen. Sie können folgern, dass sich die St_Id -Spalte auf die Status -Tabelle bezieht - sie gibt eine größere Abdeckung der Zeilen der Tabelle (2/3 der Zeilen werden "verwendet", während nur 3% der Zeilen verwendet werden) in der Tabelle State würde verwendet werden).

Wenn Sie Datenanalysen an vorhandenen Datenbanken durchführen, um "reale Daten" zu sammeln, würde ich einige Muster erwarten, die als Anhaltspunkte für die Strukturschlussfolgerung dienen könnten. Wenn eine Tabelle mit einer großen Anzahl von Datensätzen eine Spalte mit einer kleinen Anzahl von Werten aufweist, die mehrmals wiederholt werden (nicht unbedingt in der richtigen Reihenfolge), bezieht sich diese Spalte eher auf eine Tabelle mit einer entsprechend kleinen Anzahl von Zeilen.

Zusammenfassung

Viel Glück. Es ist ein interessiertes Problem, ich habe gerade einige Ideen rausgeschmissen, aber das ist sehr viel ein Versuch & amp; Fehler, Datenerfassung und Performance Tuning Situation.

    
Kirk Broadhurst 22.08.2011 03:48
quelle
3

Dies ist in den meisten Fällen eine nicht-triviale Übung. Wenn Sie das Glück haben, ein Schema für ein modernes Framework wie Ruby on Rails oder CakePHP o.ä. zu analysieren, und die Entwickler streng darauf geachtet haben, den Spaltenkonventionen zu folgen, haben Sie eine gute Chance, viele, aber nicht alle zu finden , der impliziten Beziehungen.

i.e. Wenn Ihre Tabellen Spalten wie user_id verwenden, um auf Einträge in den Tabellen users zu verweisen.

Seien Sie sich bewusst : Einige Entitätsnamen können plural unregelmäßig sein ( entity ist ein gutes Beispiel: entities , nicht entitys ) und diese sind schwerer zu fangen (aber immer noch möglich). Schlüssel wie admin_id , mit denen die Entwickler der Tabelle users auf user.id beitreten, können jedoch nicht abgeleitet werden. Sie müssten diese Fälle manuell behandeln.

Sie haben kein RDBMS angegeben, aber ich habe MySQL sehr oft verwendet und arbeite gerade an diesem Problem für mich.

Das folgende MySQL-Skript wird die meisten Beziehungen ableiten, die durch Spaltennamen impliziert werden. Es listet dann alle Beziehungen auf, für die es Tabellennamen nicht finden konnte, so dass Sie zumindest wissen, welche Ihnen fehlen. Die abgeleiteten Eltern und Kinder werden zusammen mit den Singular- und Pluralnamen sowie der implizierten Beziehung aufgelistet:

%Vor%

Dies wird Ergebnisse wie folgt zurückgeben:

Dann können Sie alle Namenskonvention-Ausnahmen überprüfen, die mit:

erkannt wurden %Vor%

Dies liefert Ergebnisse wie diese, die Sie manuell bearbeiten können:

Sie können diese Skripts so ändern, dass sie das ausspucken, was für Sie nützlich ist. Wenn Sie möchten, fügen Sie auch Anweisungen zum Erstellen von Fremdschlüsseln hinzu. Hier ist die letzte Spalte eine einfache "hat viele" -Beziehungsanweisung. Ich benutze dies in einem Werkzeug namens Pidgin, genannt Pidgin, das ein schnelles Modellierungstool ist, das Beziehungsdiagramme auf der Grundlage von Beziehungsanweisungen zeichnet, die in einer sehr einfachen Syntax geschrieben sind (genannt 'Pidgin'). Sie können es auf Ссылка

ausprobieren

Ich habe das obige Skript in einer Demo-DB ausgeführt, um Ihnen die Art von Ergebnissen zu zeigen, die Sie erwarten können:

Ich habe den irregulären Plural in meinem Drehbuch nicht berücksichtigt, aber ich könnte mich auch darum bemühen, zumindest für den Fall von Entitäten, die auf -y enden. Wenn Sie das selbst ausprobieren möchten, würde ich empfehlen, eine gespeicherte Funktion zu schreiben, die <name>_id Spaltennamen als Parameter akzeptiert, den _id -Teil entfernt und dann einige Heuristiken anwendet, um zu versuchen, die Pluralisierung korrekt durchzuführen.

Ich hoffe, das ist nützlich!

    
Gruff 29.08.2014 12:13
quelle
1

Die folgenden Produkte behaupten alle, Erkennungsfähigkeiten für Fremdschlüssel bereitzustellen:

ERwin Ссылка

Informatica Ссылка

und XCaseForI Ссылка

Statistische Methoden, die in der Lage sind, eine Art Ähnlichkeit zu bieten, rangieren nach der von Kirk vorgeschlagenen Verteilungs- und Erstellungszeit. scheint der richtige Weg zu sein.  .. Ich müsste es mit SAS EG oder einem kostenlosen Tool implementieren.

    
user1767316 21.09.2015 13:11
quelle
0

Ich weiß nicht über die Software, die bei der Suche helfen kann, was Sie benötigen, aber die folgende Abfrage hilft Ihnen beim Einstieg. Es listet alle Fremdschlüsselbeziehungen innerhalb der aktuellen Datenbank auf.

%Vor%

Hoffe, das hilft.

    
AlphaMale 21.08.2011 10:46
quelle