Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem MySQL, databáze pro uložení uživatelských práv jako v linuxu

Ahoj
Dělám MySQL databázi pro aplikaci. Mělo by to být podobně jako v linuxu (ve win je to asi stejně).
Uživatel je vždy ve své vlastní skupině (1:1, mají stejné jméno), ale může se přidat i do jiné "neuživatelské" skupiny (např. moderátoři), uživatel může být ve více skupinách.(M:M)
Každá skupina vlastní i "neuživatelská" mají uložena nějaká oprávnění pro různé akce v aplikaci (to asi nemá vliv na funkčnost)
V tabulce 'files' jsou uložené soubory, každý soubor by měl mít uživatele a skupinu a práva (vlastník/skupina/ostatní, rwx/rwx/rwx)

mám tedy tabulku 'user' (kromě id, jmena.. tam jsou i opravneni vlastni skupiny), v tabulce 'role' jsou jen "neuživatelské" skupiny, pak mám vazební tabulku 'membership' jsou v ni jen dva primární a zaroveň cizí klíče userID, roleID

když chci do tabulky 'files' dát cizí klíč userID, je to ok, chci přdat cizí klíč roleID a už to nejde
chyba: SQL Error (1005): Can't create table 'databaze.#sql-634_4' (errno: 150) Foreign key constraint is incorrectly formed

když chci přidat místo dvou sloupců user, role přidat jen jeden sloupec s cizím klíčem z tabulky 'membership', vyskakuje stejná chyba (a to i když referenci na oba klíče userID, roleID nebo jen na jeden)

Nevím co s tím nebo jak to změnit :(

Předmět Autor Datum
Zrejme mas v tabulce neco, co brani nastaveni constraintu. V RoleID je hodnota, ktera neni v tabulce…
Jan Fiala 09.05.2013 13:20
Jan Fiala
Máte pravdu, měl jsem tam jiný datový typ. Děkuji za rychlou odpověď. Chtěl bych se ještě zeptat je…
Banshee 09.05.2013 13:34
Banshee
podle mě to máš úplně špatně, protože nemáš normalizovány tabulky (edit: a dříve či později to bude…
touchwood 09.05.2013 13:22
touchwood
takhle jsem to předělal, zkusil jsem ještě do user přidat primary_group a jako FK gId z groups, ale…
Banshee 09.05.2013 15:32
Banshee
hoď sem dump databáze a selekt
touchwood 14.05.2013 11:04
touchwood
Stačí tohle? CREATE TABLE `user` ( `uId` INT(11) NOT NULL AUTO_INCREMENT, `uLogin` VARCHAR(50) NOT…
Banshee 14.05.2013 11:18
Banshee
a to pole v User máš oindexované? (protože já v tom dumpu to pole vůbec nevidím..)
touchwood 14.05.2013 14:30
touchwood
v tom dumpu to není když tam přidám do user: `uPrimaryGroup` INT(11) NOT NULL, INDEX `uPrimaryGrou…
Banshee 14.05.2013 15:08
Banshee
ale constraint je přece jen integritní omezení, to není relace! - podle mně stačí vyhodit kaskádové…
touchwood 14.05.2013 15:41
touchwood
zkusil jsem dát kaskády pryč ale pořád to samé poslední
Banshee 14.05.2013 15:58
Banshee

podle mě to máš úplně špatně, protože nemáš normalizovány tabulky (edit: a dříve či později to bude proklínat, protože narazí na omezení, daná špatným návrhem datového modelu).

udělej si:
- tabulku čistě user s user_ID jako primárním klíčem (můžeš přidat pole s položkou "primary_group" do které uložíš group_id primární skupiny)
- tabulku group s primárním klíčem Group_ID
- tabulku group_members, která bude pivot tablicí mezi user_id a group_id
- tabulku rolí tedy můžeš zcela vypustit, nebo do ní přidat aplikační logiku a navázat ji na tabulku "group" - to závisí na objemu těch rolí

takhle jsem to předělal, zkusil jsem ještě do user přidat primary_group a jako FK gId z groups, ale háže mi to chybu
asi to už nepujde svázat, myslel si to tak že by primary_group byl bez referncí?

SQL Error (1452): Cannot add or update a child row: a foreign key constraint fails (`databáze`.`#sql-634_4`, CONSTRAINT `FK_user_groups` FOREIGN KEY (`uPrimaryGroup`) REFERENCES `groups` (`gId`))

Stačí tohle?

CREATE TABLE `user` (
	`uId` INT(11) NOT NULL AUTO_INCREMENT,
	`uLogin` VARCHAR(50) NOT NULL COLLATE 'utf8_czech_ci',
	`uPass` VARCHAR(128) NOT NULL COLLATE 'utf8_czech_ci',
	`uEmail` VARCHAR(50) NOT NULL COLLATE 'utf8_czech_ci',
	`uActive` INT(11) NOT NULL,
	PRIMARY KEY (`uId`),
	UNIQUE INDEX `uLogin` (`uLogin`)
)
COLLATE='utf8_czech_ci'
ENGINE=InnoDB

CREATE TABLE `groups` (
	`gId` INT(11) NOT NULL AUTO_INCREMENT,
	`gName` VARCHAR(50) NOT NULL COLLATE 'utf8_czech_ci',
	`gDescription` TEXT NULL COLLATE 'utf8_czech_ci',
	PRIMARY KEY (`gId`),
	UNIQUE INDEX `gName` (`gName`)
)
COLLATE='utf8_czech_ci'
ENGINE=InnoDB

CREATE TABLE `membership` (
	`mId` INT(11) NOT NULL AUTO_INCREMENT,
	`muId` INT(11) NOT NULL,
	`mgId` INT(11) NOT NULL,
	PRIMARY KEY (`mId`),
	INDEX `FK_membership_user` (`muId`),
	INDEX `FK_membership_groups` (`mgId`),
	CONSTRAINT `FK_membership_groups` FOREIGN KEY (`mgId`) REFERENCES `groups` (`gId`) ON UPDATE CASCADE ON DELETE CASCADE,
	CONSTRAINT `FK_membership_user` FOREIGN KEY (`muId`) REFERENCES `user` (`uId`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_czech_ci'
ENGINE=InnoDB

CREATE TABLE `role` (
	`rId` INT(11) NOT NULL DEFAULT '0',
	`rAccessLevel` TINYINT(1) NOT NULL DEFAULT '0',
	`rGroupAdd` TINYINT(1) NOT NULL DEFAULT '0',
	`rGroupChange` TINYINT(1) NOT NULL DEFAULT '0',
	`rGroupDelete` TINYINT(1) NOT NULL DEFAULT '0',
	`rUserAdd` TINYINT(1) NOT NULL DEFAULT '0',
	`rUserChange` TINYINT(1) NOT NULL DEFAULT '0',
	`rUserDelete` TINYINT(1) NOT NULL DEFAULT '0',
	INDEX `rId` (`rId`),
	CONSTRAINT `FK_role_groups` FOREIGN KEY (`rId`) REFERENCES `groups` (`gId`) ON UPDATE CASCADE ON DELETE CASCADE
)
COLLATE='utf8_czech_ci'
ENGINE=InnoDB;

Chtěl sem tam přidat do User sloupek primaryGroup s referencí groups.gId, ale hláška viz předchozí post.

v tom dumpu to není

když tam přidám do user:

`uPrimaryGroup` INT(11) NOT NULL,
INDEX `uPrimaryGroup` (`uPrimaryGroup`),
CONSTRAINT `FK_user_groups` FOREIGN KEY (`uPrimaryGroup`) REFERENCES `groups` (`gId`) ON UPDATE CASCADE ON DELETE CASCADE

tak to nefunguje, viz hláška nad

spíš si myslím že když mám user->membership<-groups, tak že už nejde přidat reference mezi user->groups

ale constraint je přece jen integritní omezení, to není relace! - podle mně stačí vyhodit kaskádové aktualizace a mazání (reálně nevidím důvod proč to tam mít, protože samotné změny bys měl dělat vlastním selectem), tam by problém být mohl.

(přiznám se, že MySQL nepoužívám a neznám, takže se možná pletu)

Zpět do poradny Odpovědět na původní otázku Nahoru