Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Hilfe bei Datebankdesign

Frage Entwicklung Datenbanken

Mitglied: TheUntouchable

TheUntouchable (Level 1) - Jetzt verbinden

11.07.2014, aktualisiert 16.07.2014, 917 Aufrufe, 9 Kommentare

Hallo Leute,

da ich im Moment eine kleine Denkblockade habe, wende ich mich an euch

Ich möchte eine kleine Benutzerverwaltung für eine PHP Seite erstellen. Hierbei soll dann auch aufgezeichnet werden, wer wann wie was wo weshalb warum macht ;)

Dabei geht es um folgende Tabellen:

01.
create table gruppen ( 
02.
	GNr		int unsigned auto_increment not null primary key, 
03.
	GName		varchar(20) 
04.
);
01.
create table benutzer ( 
02.
	BNr		int unsigned auto_increment not null primary key, 
03.
	BName		varchar(20) not null, 
04.
	Passwort	varchar(256) not null, 
05.
	Gruppe		int unsigned not null, 
06.
 
07.
	foreign key (Gruppe) 
08.
	references gruppen(GNr) 
09.
);
01.
create table überwachung( 
02.
	UNr		int unsigned auto_increment not null primary key, 
03.
	LetzerLogin	datetime, 
04.
	LetzteAktio	datetime, 
05.
	Erstellt	datetime not null, 
06.
	ErstelltVon int unsigned not null, 
07.
	Geändert	datetime, 
08.
	GeändertVon	int unsigned, 
09.
	 
10.
	foreign key (ErstelltVon) 
11.
	references benutzer (BNr), 
12.
 
13.
	foreign key (GeändertVon) 
14.
	references benutzer (BNr) 
15.
);
Ich möchte, das unter GeändertVon und ErstelltVon jeweils der User steht (also die BNr), der den anderen User erstellt oder bearbeitet hat. Aber ich hab gerade keinen Plan wie ich das hinbekomme.. Ich habs gefühl ich bräuchte noch eine Tabelle zwischen benutzer und überwachung..

Kann mir da wer unter die Arme greifen?

Danke
Mitglied: SlainteMhath
11.07.2014 um 11:54 Uhr
Moin,

GeändertVon braucht noch ein "not null" sonst klappt das mit dem ForeignKey nicht.

Grundsätzlich würde ich das anders ausfbauen.
eher so
01.
... 
02.
UNr		int unsigned auto_increment not null primary key,  
03.
Zeitstempel  datetime, 
04.
Aktion  varchar(512), 
05.
DurchgefuehrtVon  int unsinged not null, 
06.
DurchgefuehrtAn    int unsinged not null, 
07.
 
08.
foreign key (DurchgefuehrtVon) references benutzer (BNr), 
09.
foreign key (DurchgefuehrtAn) references benutzer (BNr)
lg,
Slainte
Bitte warten ..
Mitglied: TheUntouchable
11.07.2014, aktualisiert um 12:08 Uhr
Hi Slainte und danke für deine Antwort!

Ich glaube das "not null" hab ich vorhin schon weggemacht, ich kanns jedenfalls nicht mehr finden

Bezüglich deines Vorschlags: Ansich nicht schlecht, aber ich möchte später in einer Liste alle Benutzer auflisten lassen, mit den Feldern die oben angegeben sind Die UNr sollte eigentlich dann die Nummer des jeweiligen Benutzers sein, aber wie ich die mit der BNr verknüpfe ist im Moment mein Problem.. Direkt als foreign key oder eine Tabelle dazwischen?

Die Tabelle, die ich ausgeben will, soll so aussehen:

BNr, Bname, Gruppe, LetzterLogin, LetzteAktion, Erstellt, ErstelltVon (BNr->BName), Geändert, GeändertVon (BNr->BName)
Bitte warten ..
Mitglied: Biber
11.07.2014, aktualisiert um 16:31 Uhr
Moin SlaintheMath,


Zitat von SlainteMhath:

GeändertVon braucht noch ein "not null" sonst klappt das mit dem ForeignKey nicht.

Das ist so nicht ganz richtig.
Das Feld GeändertVon kann durchaus NULLABLE sein - und der Inhalt darf dann auch bei gesetztem FK-Constraint entweder NULL oder ben ein gültiger Wert aus der referenzierten Parent-Tabelle sein.

Die Constraint sollte dann auch "ON DELETE SET NULL" beinhalten, d.h. wenn der "GeändertVon"-User 4711 aus der Parent-Tabelle gelöscht wird, dann soll in der Child-Tabelle überall der "GeändertVon"-User 4711 auf NULL geändert werden.
Dazu muss aber das Feld NULLABLE sein.

Grüße
Biber
Bitte warten ..
Mitglied: SlainteMhath
11.07.2014 um 12:32 Uhr
@Biber
Ja du hast natürlich Recht. Ich arbeite bei FK's aber sehr ungern mit CASCADE/ON DELETE SET NULL. Lieber lass ich das DBS einen Fehler schmeissen als das es mir mit der NULL-Kettensäge durch die DB fährt

@TheUntouchable
Wenns Du's wirklich so haben willst, brauchst du keine zusätzliche Tabelle. Beachte aber den Post von Biber.
Bitte warten ..
Mitglied: Biber
11.07.2014, aktualisiert um 13:14 Uhr
Moin Slainthe,,

na ja, bei CASCADE gebe ich dir recht.
Aber bei SET NULL...
Gerade hier in diesem Fall wären die Alternativen

- (bei einem Standard ON DELETE RESTRICT) - der User 4711, der vor 2 Jahren Admin war und 50 andere "geändert" hat (z.B. Passwort-Reset) darf niemals nich gelöscht werden, auch wenn er schon seit der letzten Sonnenwendfeier in Walhalla frühstückt.
- (bei ON DELETE CASCADE) - der User 4711 wird aus o.a. Gründen gelöscht und alle 50 User, denen er beim Passwort-Reset gehölfen hat, folgen ihm in die grosse Trinkhalle.

Da wäre meine Präferenz doch ein ON DELETE SET NULL.

Grüße
Biber:
Bitte warten ..
Mitglied: TheUntouchable
15.07.2014, aktualisiert um 22:10 Uhr
Kleines/Großes Update:

Meine Tabellen sehen jetzt folgender maßen aus:

01.
create table gruppen ( 
02.
	GNr			int unsigned auto_increment not null primary key, 
03.
	GName		varchar(20) 
04.
);
01.
create table benutzer ( 
02.
	BNr			int unsigned auto_increment not null primary key, 
03.
	BName		varchar(20) not null, 
04.
	Passwort	varchar(256) not null, 
05.
	Gruppe		int unsigned, 
06.
 
07.
	foreign key (Gruppe) 
08.
	references gruppen(GNr) 
09.
);
01.
create table überwachung( 
02.
	BNr			int unsigned not null primary key, 
03.
	LetzerLogin	datetime, 
04.
	LetzteAktio	datetime, 
05.
	Erstellt	datetime not null, 
06.
	ErstelltVon int unsigned not null, 
07.
	Geändert	datetime, 
08.
	GeändertVon	int unsigned, 
09.
 
10.
	foreign key(BNr) 
11.
	references benutzer(BNr) 
12.
	ON DELETE SET NULL, 
13.
	 
14.
	foreign key (ErstelltVon) 
15.
	references benutzer (BNr) 
16.
	ON DELETE SET NULL, 
17.
 
18.
	foreign key (GeändertVon) 
19.
	references benutzer (BNr) 
20.
	ON DELETE SET NULL 
21.
);
Hier ein paar Daten, um mich dann auch am System anmelden zu können:

01.
insert into benutzer (BName, Passwort) values 
02.
('Michael','-zensiert-');
01.
insert into überwachung (BNr,Erstellt, ErstelltVon) values 
02.
('1','0000-00-00 00:00:00','1')
Mit dieser Abfrage
01.
select * from benutzer inner join überwachung using (BNr)
Bekomme ich dann folgende Ausgabe:
01.
# BNr, BName, Passwort, Gruppe, LetzerLogin, LetzteAktio, Erstellt, ErstelltVon, Geändert, GeändertVon 
02.
'1', 'Michael', '-zensiert-', NULL, NULL, NULL, '0000-00-00 00:00:00', '1', NULL, NULL
Und jetzt meine Frage, auf die ich schon die ganze Zeit hinaus will:
Wie bekomme ich es hin, das bei Erstellt Von nicht die 1 sondern der Name des Benutzers steht? :D

PS: Vielen Dank für die schon gekommen Antworten und für die noch kommenden! :D
Bitte warten ..
Mitglied: SlainteMhath
LÖSUNG 16.07.2014, aktualisiert um 11:33 Uhr
Versuchs mal so
01.
select u.*, b1.BName as ErstelltVonBenutzer, b2.BName as GeaendertVonBenutzer 
02.
from uberwachung as u 
03.
left join Benutzer as b1 on u.ErstelltVon = b1.BNr 
04.
left join Benutzer as b2 on u.GeaendertVon = b2.BNr
Bitte warten ..
Mitglied: TheUntouchable
16.07.2014 um 11:34 Uhr
Super, hat geklappt! Vielen vielen Dank Das mit den Alias für die Tabellen war mir neu
Bitte warten ..
Mitglied: TheUntouchable
16.07.2014 um 13:52 Uhr
Das ist jetzt meine endgültige Lösung, falls es jemanden interessiert ;)

01.
$anweisung =  	"select benutzer.BNr, benutzer.BName, gruppen.GName, überwachung.LetzerLogin, überwachung.LetzteAktio, überwachung.Erstellt, b1.BName as ErstelltVon, überwachung.Geändert, b2.BName as GeändertVon 
02.
						from benutzer left join überwachung using (BNr) 
03.
						left join benutzer as b1 on b1.BNr = überwachung.ErstelltVon 
04.
						left join benutzer as b2 on b2.BNr = überwachung.GeändertVon 
05.
						left join gruppen on gruppen.GNr = benutzer.Gruppe";
Bitte warten ..
Neuester Wissensbeitrag
Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (33)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (21)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...