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 kannKennst du irgendwelche Werkzeuge, die wenn möglich frei sind, die das schon tun können?
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)
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
beinhaltenFirstCustomerId
& 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.
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 Ссылка
ausprobierenIch 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!
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.
Tags und Links foreign-keys foreign-key-relationship database-diagram database-diagramming