vastgelopen relatie
Ik ben bezig met database een opzetje voor mijn ACL class.
Echter is SQL nou niet echt mijn ding dus vandaar ik hier mijn vraag post.
Om te beginnen zal ik eerst mijn tabellen laten zien:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
CREATE TABLE IF NOT EXISTS users ( id int(10) NOT NULL AUTO_INCREMENT,
username varchar(30) COLLATE utf8_bin NOT NULL,
password varchar(255) COLLATE utf8_bin NOT NULL,
email varchar(50) COLLATE utf8_bin NOT NULL,
created_at datetime NOT NULL,
last_login datetime NOT NULL,
login_hash varchar(255) COLLATE utf8_bin NOT NULL,
group_id INT(10) DEFAULT '1',
PRIMARY KEY (id),
UNIQUE KEY email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS usergroups ( group_id int(10) NOT NULL AUTO_INCREMENT,
group_name VARCHAR(100) NOT NULL,
PRIMARY KEY (group_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS permissions ( pid INT(10) NOT NULL AUTO_INCREMENT,
permission_name VARCHAR(100) NOT NULL,
PRIMARY KEY (pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS user_permission ( user_pid INT(10) NOT NULL AUTO_INCREMENT,
permission_code INT(10) NOT NULL,
PRIMARY KEY (user_pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
username varchar(30) COLLATE utf8_bin NOT NULL,
password varchar(255) COLLATE utf8_bin NOT NULL,
email varchar(50) COLLATE utf8_bin NOT NULL,
created_at datetime NOT NULL,
last_login datetime NOT NULL,
login_hash varchar(255) COLLATE utf8_bin NOT NULL,
group_id INT(10) DEFAULT '1',
PRIMARY KEY (id),
UNIQUE KEY email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS usergroups ( group_id int(10) NOT NULL AUTO_INCREMENT,
group_name VARCHAR(100) NOT NULL,
PRIMARY KEY (group_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS permissions ( pid INT(10) NOT NULL AUTO_INCREMENT,
permission_name VARCHAR(100) NOT NULL,
PRIMARY KEY (pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS user_permission ( user_pid INT(10) NOT NULL AUTO_INCREMENT,
permission_code INT(10) NOT NULL,
PRIMARY KEY (user_pid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1;
Op zich allemaal vrij standaard denk ik, dus dat is niet echt het probleem.
Nu heb ik 1 relatie aangelegd tussen usergroups en de user:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
ALTER TABLE
users
ADD
FOREIGN KEY(group_id)
REFERENCES usergroups (group_id)
ON DELETE RESTRICT
ON UPDATE CASCADE
users
ADD
FOREIGN KEY(group_id)
REFERENCES usergroups (group_id)
ON DELETE RESTRICT
ON UPDATE CASCADE
Dat werkt, dus so far so good. DEFAULT '1' in het user tabel word gewoon iets van "member" in de usergroups.
Nu moet er (lijkt mij) ook een relatie komen tussen wat de users mogen doen.
Hier gaat mijn ACL class aan het werk, door alle permissies een bepaalde code te genereren.
Dus uiteindelijk als alle permissies bij elkaar komen heb ik 1 code die weer de database in moeten.
Nu komt het eigenlijke probleem.
Hoe leg ik die relatie het handigst aan? (als daar een relatie zou moeten komen)
Ik kan er ook voor kiezen om de code in de user tabel te zetten.
Ik kan er ook een tabel (wat ik hierboven heb staan) in een apart tabel zetten.
Maar heeft dat voordeel? En zo ja, hoe ga ik die refereren aan elkaar?
Gelukkig maar ;-)
Als ik het goed begrijp, dan is het een 1- 1 relatie.
In dat geval is de user_pid geen auto_increment maar gewoon de PK met daarop een FK die refereert aan de PK van de user tabel.
Heeft het voordeel? Als een 1 - 1 en alleen 1 relatie (aka een monogaam huwelijk) is dan niet.
Is het een 1 - 1 of 0 (aka een LAT relatie) zou het een voordeel kunnen zijn, maar eigenlijk alleen als de tabel meerdere kolommen heeft.
Mijn eerste gedachten was dus ook een "monogame relatie".
Althans zo heb ik het nu in mijn ACL class zitten.
Het enige wat hij doet is gewoon de permissies toevoegen wat dus in mijn permissions tabel komt te staan.
Daaraan kan ik bijvoorbeeld aangeven:
- Read
- Write
- edit
- delete.
Dat husselen we door elkaar met een pow() sausje, en dan komt er een code uit.
Noem maar even wat nummer 15.
Dus bij het ophalen hoef ik alleen de permissies uit te lezen en het te vergelijken met de code (15 ) wat wel en niet mag.
Dit lijkt me in eerste ingeving goed te kloppen met wat ik voor me zie.
Mocht ik toch nog vastlopen dan laat ik het even weten.
Bedankt voor je tijd en uitleg.