# ER-Modell aus MySQL DB erzeugen



## Admi (4. April 2007)

Hi

Ich suche eine Möglichkeit (ein Programm), dass in der Lage ist aus einer bestehenden MySQL Datenbank (mit 20 Tabellen Inhalt) automatisch ein ER-Modell zeichnen zu können. Natürlich mit den ganzen Beziehungen, Entitäten, etc.

Gibt es so ein Progi? Wär echt fein, wenns das geben würde


----------



## tobias_petry (4. April 2007)

schau dir mal die kostenlosen Programme von der MySQL Webseite an, die können das, ein ER-Modell kann jedoch nur von InnoDB Tabellen erzeugt werden, da nur diese Relationen kann, eine MyIsam Tabelle kennt folglich keine Relationen und es können keine ausgelesen werden, die musst du dann erst anlegen.


----------



## Admi (4. April 2007)

Mhm...sind alles MyISAM, muss ich wohl erst in INNODB umwandeln. Du meinst dann wohl den MySQL Query Browser?

Ähm ja ^^ Der MySQL Administrator vermeldet mir, dass InnoDB not enabled ist. Wie kann ich das denn anstellen mit der Portierung in InnoDB? Ich hätte auch noch SQLYog und phpMyAdmin, wenn die das irgendwie beherrschen.


----------



## Radhad (4. April 2007)

Ich denke er meint den MySQL Workbench (alpha - Download im Forum). Das erzeugt ein Modell welches ähnlich dem Datenmodell ist. Das Tool darin wird von MySQL als "Reverse Engineering" bezeichnet. Ich habe es allerdings noch nicht ausprobiert.


----------



## Admi (4. April 2007)

Das mit dem Reverse E. im Workbench funktioniert soweit, allerdings ohne die Beziehungen. 

Wenn das nur mit InnoDB geht, wie kann ich von MyISAM zu InnoDB konvertieren? MySQL Administrator bringt mir dazu nur eine Fehlermeldung, dass InnoDB not enabled ist (rot hinterlegt)


----------



## Radhad (4. April 2007)

Das hört sich an, als wäre die InnoDB Storage Engine nicht installiert oder nicht aktiviert. Dies sieht man mit dem Statement "SHOW ENGINES".

Wie man MyISAM zu InnoDB konvertiert weiß ich nicht (nicht erforderlich, baue eine neue Datenbank). Allerdings gibt es ein paar Regeln, die man beachten muss, zum Beispiel dass ein FK immer einen Index haben muss. Das Manual beschreibt InnoDB sehr gut. Hier mal ein Beispiel-Create Script für einen Blog:


```
CREATE TABLE Users (
  UserID INT(255) NOT NULL AUTO_INCREMENT,
  Username VARCHAR(255) NOT NULL,
  eMail VARCHAR(255) NOT NULL,
  Password VARCHAR(255) NOT NULL,
  SessionID VARCHAR(255) NOT NULL,
  RegistrationDate DATE NULL,
  Firstname VARCHAR(255) NULL,
  Lastname VARCHAR(255) NULL,
  Birthday DATE NULL,
  ShowRealname BOOL NOT NULL DEFAULT 0,
  PRIMARY KEY(UserID)
)
TYPE=InnoDB;

CREATE TABLE Blogs (
  BlogID INT(255) NOT NULL AUTO_INCREMENT,
  UserID_FK INT(255) NOT NULL,
  Title VARCHAR(255) NOT NULL,
  CreateDate DATE NOT NULL,
  PRIMARY KEY(BlogID),
  INDEX Blogs_FKIndex1(UserID_FK)
)
TYPE=InnoDB;

CREATE TABLE Categories (
  CategoryID INT(255) NOT NULL AUTO_INCREMENT,
  Categoryname VARCHAR(255) NULL,
  PRIMARY KEY(CategoryID)
)
TYPE=InnoDB;

CREATE TABLE Blog_Categories (
  BlogID INT(255) NOT NULL,
  CategoryID INT(255) NOT NULL,
  PRIMARY KEY(BlogID, CategoryID),
  INDEX Blog_Categories_FKIndex1(BlogID),
  INDEX Blog_Categories_FKIndex2(CategoryID)
)
TYPE=InnoDB;

CREATE TABLE Blog_Articles (
  Blog_ArticleID INT(255) NOT NULL AUTO_INCREMENT,
  LastModifiedBy INT(255) NOT NULL,
  CreatedBy INT(255) NOT NULL,
  BlogID_FK INT(255) NOT NULL,
  Headline TEXT NOT NULL,
  Articletext TEXT NOT NULL,
  CreateDate DATE NOT NULL,
  LastModifiedDate DATE NOT NULL,
  Published BOOL NOT NULL DEFAULT 0,
  PRIMARY KEY(Blog_ArticleID),
  INDEX Blog_Articles_FKIndex1(BlogID_FK),
  INDEX Blog_Articles_FKIndex2(CreatedBy),
  INDEX Blog_Articles_FKIndex3(LastModifiedBy)
)
TYPE=InnoDB;

CREATE TABLE Blog_Article_Pages (
  Page INT(255) NOT NULL,
  Blog_ArticleID INT(255) NOT NULL,
  Articletext TEXT NULL,
  PRIMARY KEY(Page, Blog_ArticleID),
  INDEX Blog_Article_Pages_FKIndex1(Blog_ArticleID)
)
TYPE=InnoDB;

CREATE TABLE Blog_Article_Comments (
  Blog_Article_CommentID INT(255) NOT NULL AUTO_INCREMENT,
  LastModifiedBy INT(255) NOT NULL,
  CreatedBy INT(255) NOT NULL,
  Blog_ArticleID INT(255) NOT NULL,
  Commenttext TEXT NOT NULL,
  CreateDate DATE NOT NULL,
  LastModifiedDate DATE NOT NULL,
  PRIMARY KEY(Blog_Article_CommentID),
  INDEX Blog_Article_Comments_FKIndex1(Blog_ArticleID),
  INDEX Blog_Article_Comments_FKIndex2(CreatedBy),
  INDEX Blog_Article_Comments_FKIndex3(LastModifiedBy)
)
TYPE=InnoDB;
```
Ist zwar nen Großes Script, aber es verdeutlicht genau, worauf man achten muss. Das habe ich mit dem DB Designer 4 erstellt, da kann man InnoDb als Storage Engine auswählen. Du müsstest dann die Datensätze in der neuen Datenbank quasi neu genereiren, damit die Abhängigkeiten richtig sind. Das würde ich dir dabei empfehlen! Tipps dürfte es auch im Forum von MySQL zu InnoDB geben (dafür gibt es ein eigene Unterforum!)


Gruß Radhad


PS: InnoDB löst hoffentlich bald MyISAM ab 


[EDIT]
InnoDB verhält sich mit seinen Abhängigkeiten fast genauso wie Oracle! Was bei diesem Script fehlt, sind fogende Anweisungen:

ON DELETE
ON UPDATE

näheres dazu im Manual.


----------



## Admi (4. April 2007)

Danke schonmal für die Hilfen! 

Ich habe nun alle Tabellen als InnoDB vorliegen, habe per Workbench und Reverse Engineering die Übersicht erzeugt und trotzdem zeigt er mir keine Verbindungen zwischen den Tabellen? Muss ich die selber einzeichnen? Bis jetzt seh ich leider nur die Tabellen selbst aber keine Relationen zueinander


----------



## henpara (4. April 2007)

Kennst du die Beziehungen? oder willst du diese von dem ER-Diagramm wissen?

Falls du sie kennst, und "nur" ein ER-Diagramm haben willst lad dir doch DBDesigner 4 runter - is freeware und erstell dir das Diagramm selber? 

Gruß


----------



## Admi (4. April 2007)

Sinn meiner Anfrage ist es ja, dass das Programm selbstständig und automatisch die Übersicht aus meiner DB heraus zeichnen soll. Bis jetzt zeichnet er leider nur die Tabellen, nicht aber die Relationen zwischen den Tabellen. Etwa 1:1 Beziehung zwischen den IDs von 2 Tabellen.

Vom Prinzip her das selbe, wie bei der UML. Da kann man ja auch aus Code die UML-Übersicht erstellen und umgekehrt auch aus der UMLÜbersicht den Code generieren.


----------



## tobias_petry (4. April 2007)

Radhad hat gesagt.:


> PS: InnoDB löst hoffentlich bald MyISAM ab


Das hoffe ich nicht und wird zum Glück auch nie passieren, die parallele Lesegeschwindigkeit von MyIsam ist über alle DBMS ungeschlagen. Und das langsame Count() von InnoDB, ne muss net sein, beide sind Klasse, aber sie haben auch beide ihre eigenen Anwendungsbereiche.

Admi, warum soll die MySQL Workbench alles automatisch machen? Du kannst doch aus MyIsamTabelen die Struktur auslesen lassen und die Relationen manuell hinzufügen.
Eine Tabelle in InnoDB umzuwandeln, nur wegen einem Relation-View ist so mit das dümmste, denn die beiden Tabellentypen unterscheiden sich nicht ohne Grund so stark, und beide haben ihr Anwendungsgebiet, wenn du in deiner Anwendung die refernzielle Integrität benötigst ist ein Wechsel zu InnoDB natürlich vollkommen legitim aber ansonsten würd eich die Pros/Cons beiderTabellentypen abwägen

Automatisch Beziehungen erstellen kann es dir natürlich nicht, woher sollte es diese auch kennen? die musst du natprlich vorher erst in InnoDB mit Fremdschlüsseln festlegen, aber dann kannst du doch genausogut es in dem ER-Modell einstellen ?


----------

