WinFuture-Forum.de: Mysql Tabelle Anlegen - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Mysql Tabelle Anlegen


#1 Mitglied ist offline   Tazzilo 

  • Gruppe: aktive Mitglieder
  • Beiträge: 55
  • Beigetreten: 13. Juli 08
  • Reputation: 0

  geschrieben 15. Oktober 2009 - 22:57

Bin mehr oder weniger Datenbanken-Neuling.
Ich habe eine kleine Sammlung an Greasemonkey-Scripte für unterschiedliche Seiten...

Ich möchte jetzt per mySQL eine Tabelle anlegen, in der jeder Eintrag ein Verweis auf eine andere Tabelle ist.


Übertabelle:
=========
1. TABELLE A
2. TABELLE B
3. TABELLE C


TABELLE A (für Seite A)
=========
Skript A | ID | USW.
Skript B | ID | USW.


TABELLE B (für Seite B)
=========
Skript A | ID | USW.
Skript B | ID | USW.

...

Mir gehts erstmal um die Verlinkungen, die Keys zu den anderen Tabellen. Wie lege ich sowas an? Oder gibt es noch eine geschicktere Varianten?
Mich interessieren die Befehle, nicht was ich z.B. im phpMyadmin anklicken müsste :D


Die einzelnen Tabellen wollte ich per:

 CREATE TABLE `TABELLE_A` (
`id` int( 11 ) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`datum` DATETIME,
`name` VARCHAR( 255 ) NOT NULL ,
`description` TEXT,
`filename` VARCHAR( 255 ) NOT NULL ,
`path` VARCHAR( 255 ) NOT NULL ,
`screenshot` VARCHAR( 255 ) NOT NULL ,
`downloads` INT unsigned
) TYPE = MYISAM;


anlegen.

Dieser Beitrag wurde von Tazzilo bearbeitet: 15. Oktober 2009 - 23:04

0

Anzeige



#2 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 19. Oktober 2009 - 07:22

Du arbeitest mit Primär- und Fremdschlüssel. Fremdschlüssel zeigen auf einen Einträg aus einer zweiten Tabelle.

Hier mal ein Beispiel mit User und Role:
CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `password` varchar(40) NOT NULL,
  `username` varchar(255) NOT NULL,
  `role_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8

CREATE TABLE `roles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8


Über die role_id in der users Tabelle kannst du die konkrete Rolle herausfinden.

MYISAM ist allerdings Mist, weil es keine referentielle Integrität unterstützt. Das bedeutet, dass du Rollen löschen kannst, obwohl Benutzer die Rollen noch zugewiesen haben. Somit wirst du kurz über lang verwaiste Einträge in der DB haben.
Als Lösung bietet MySQL hier die DB-Engine InnoDB an. Die Statements der Erstellungen würden dann wie folgt aussehen:

CREATE TABLE `users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `password` varchar(40) NOT NULL,
  `username` varchar(255) NOT NULL,
  `role_id` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`),
  KEY `FK1` (`role_id`),
  CONSTRAINT `FK1` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

CREATE TABLE `roles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


Solltest du nun versuchen eine Rolle zu löschen, die Benutzer zugewiesen haben, wirst du eine Fehlermeldung erhalten.
0

#3 Mitglied ist offline   Tazzilo 

  • Gruppe: aktive Mitglieder
  • Beiträge: 55
  • Beigetreten: 13. Juli 08
  • Reputation: 0

geschrieben 20. Oktober 2009 - 21:20

Vielen Danke.
Ich denke dass ich genau das, was ich benötige. Werde damit jetzt was rumexperimentieren. :wink:
0

#4 Mitglied ist offline   Tazzilo 

  • Gruppe: aktive Mitglieder
  • Beiträge: 55
  • Beigetreten: 13. Juli 08
  • Reputation: 0

geschrieben 22. Oktober 2009 - 13:59

Bin jetzt dazu gekommen es zu implementieren...

Seh ich das richtig, dass `role_id` auf eine `id` in der `roles` Tabelle zeigt?
Aber wie kann ich es dann bewerkstelligen, dass z.B. `username` mit mehreren `roles` verknüpft ist?
`id` bei `roles` ist ja auf AUTO_INCREMENT gesetzt. Muss ich dann per Hand allen Einträgen die gleiche ID geben, damit es funktioniert?

Beispiel:
users:
ID | username | userPW | role_id
================
1 | A | 123 | 1
2 | B | 456 | 2
3 | C | 789 | 3

role:
ID | name
================
1 | test1.1
2 | test2.1
1 | test1.2
1 | test1.3
2 | test2.2
3 | test3.1


Hier macht es zwar theoretisch keinen Sinn aber ich möchte, dass ein username in deinen Beispiel mehrere roles bekommen kann. Damit ich es auf meine Datenbank anwenden kann.

Dieser Beitrag wurde von Tazzilo bearbeitet: 22. Oktober 2009 - 14:06

0

#5 Mitglied ist offline   Witi 

  • Gruppe: aktive Mitglieder
  • Beiträge: 5.942
  • Beigetreten: 13. Dezember 04
  • Reputation: 43
  • Geschlecht:Männlich
  • Wohnort:Kingsvillage
  • Interessen:Frickeln

geschrieben 22. Oktober 2009 - 17:36

Mein obiges Beispiel bildet eine Many-To-One Beziehung ab. Das bedeutet, viele Benutzer (many) können nur die eine (one) Rolle Administrator besitzen. Oder umgekehrt, die Rolle Administrator kann vielen Benutzern zugewiesen sein.

Das was du abbilden möchtest, ist eine Many-To-Many Beziehung. Viele Benutzer können viele Rollen haben. So etwas löst man immer mit einer Zwischentabelle, die lediglich die IDs aus den beiden Tabellen enthält. In dem Fall nennen wir die Tabelle z.B. users_roles. Um deine Schreibweise aufzugreifen, würde das wiefolgt aussehen:
users:
ID | username | userPW
================
1 | user1 | user1pw

roles:
ID | name
=======
1 | admin
2 | user

users_roles:
user_id | role_id
===========
1 | 1
1 | 2

Der Benutzer user1 hat somit sowohl die Rolle admin als auch die Rolle user.
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0