Diagram ERD:
Kod SQL:
CREATE TABLE IF NOT EXISTS `users` (
`login` VARCHAR(45) NOT NULL ,
`password` VARCHAR(45) NOT NULL ,
`name` VARCHAR(45) NOT NULL ,
`surname` VARCHAR(45) NOT NULL ,
`email` VARCHAR(45) NOT NULL ,
`birthdate` DATE NOT NULL ,
`logdate` DATE NULL ,
`regdate` DATE NULL ,
PRIMARY KEY (`login`) )
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `groups` (
`groupID` INT NOT NULL AUTO_INCREMENT ,
`groupname` VARCHAR(45) NOT NULL ,
`groupowner` VARCHAR(45) NOT NULL ,
`autooptymalization` TINYINT(1) NOT NULL ,
PRIMARY KEY (`groupID`) ,
INDEX `fk_groups_users` (`groupowner` ASC) ,
CONSTRAINT `fk_groups_users`
FOREIGN KEY (`groupowner` )
REFERENCES `users` (`login` ))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `groupmembers` (
`login` VARCHAR(45) NOT NULL ,
`groupID` INT NOT NULL ,
PRIMARY KEY (`login`, `groupID`) ,
INDEX `fk_groupmembers_users1` (`login` ASC) ,
INDEX `fk_groupmembers_groups1` (`groupID` ASC) ,
CONSTRAINT `fk_groupmembers_users1`
FOREIGN KEY (`login` )
REFERENCES `users` (`login` ),
CONSTRAINT `fk_groupmembers_groups1`
FOREIGN KEY (`groupID` )
REFERENCES `groups` (`groupID` ))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `commitments` (
`commitmentID` INT NOT NULL AUTO_INCREMENT ,
`commitmentname` VARCHAR(100) NOT NULL ,
`obligor` VARCHAR(45) NOT NULL ,
`obligee` VARCHAR(45) NOT NULL ,
`groupID` INT NOT NULL ,
`commitmentowner` VARCHAR(45) NOT NULL ,
`sum` FLOAT NOT NULL ,
`comment` VARCHAR(200) NULL ,
`commitmentdate` DATE NOT NULL ,
`status` INT NOT NULL ,
PRIMARY KEY (`commitmentID`) ,
INDEX `fk_commitments_groups1` (`groupID` ASC) ,
INDEX `fk_commitments_users1` (`obligor` ASC) ,
INDEX `fk_commitments_users2` (`obligee` ASC) ,
INDEX `fk_commitments_users` (`commitmentowner` ASC) ,
CONSTRAINT `fk_commitments_groups1`
FOREIGN KEY (`groupID` )
REFERENCES `groups` (`groupID` ),
CONSTRAINT `fk_commitments_users1`
FOREIGN KEY (`obligor` )
REFERENCES `users` (`login` ),
CONSTRAINT `fk_commitments_users2`
FOREIGN KEY (`obligee` )
REFERENCES `users` (`login`),
CONSTRAINT `fk_commitments_users`
FOREIGN KEY (`commitmentownerID` )
REFERENCES `users` (`login` ))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `groupjoin` (
`groupjoinID` INT NOT NULL AUTO_INCREMENT ,
`groupjoinowner` VARCHAR(45) NOT NULL ,
`groupID` INT NOT NULL ,
`login` varchar(45) NOT NULL ,
`invitation` TINYINT(1) NOT NULL ,
PRIMARY KEY (`groupjoinID`) ,
INDEX `fk_groupjoin_users1` (`login` ASC) ,
INDEX `fk_groupjoin_groups1` (`groupID` ASC) ,
CONSTRAINT `fk_groupjoin_users1`
FOREIGN KEY (`login` )
REFERENCES `users` (`login` ),
CONSTRAINT `fk_groupjoin_groups1`
FOREIGN KEY (`groupID` )
REFERENCES `groups` (`groupID` ))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `sessions` (
`sessionID` BIGINT NOT NULL,
`login` VARCHAR(45) NOT NULL,
`userIP` VARCHAR(20) NOT NULL,
`rememberme` TINYINT(1) NOT NULL,
PRIMARY KEY (`sessionID`),
CONSTRAINT `fk_sessions_users`
FOREIGN KEY(`login`)
REFERENCES `users` (`login`))
ENGINE = InnoDB;
Dane zaprezentowane w poniższych kwerendach są przykładowe i służą jedynie ustaleniu poprawności kodu SQL. Poza przedstawionymi zapytaniami do bazy danych, w przypadku realizacji większości wymienionych operacji i funkcji, zastosowano również inne mechanizmy (np. przy wykorzystaniu pakietu GWT oraz JDBC).
1. Rejestracja użytkownika do systemu:
INSERT INTO users VALUES ("login","hasło","Imię","Nazwisko","a@a.pl","1966-02-02","2011-06-02","2011-06-02");
2. Logowanie do systemu:
INSERT INTO sessions VALUES (1234, "login" , "127.0.0.1", TRUE);
UPDATE users SET logdate = "2011-06-03" WHERE login = "login");
3. Wylogowanie z systemu:
DELETE FROM sessions WHERE sessionID = "login";
4. Edycja danych użytkownika (profilu użytkownika):
UPDATE users SET password = "nowehasło" , name = "Noweimię" , surname = "Nowenazwisko" , email = "nowymail@nowymail.pl" , city = "Nowemiasto", birthdate = "1966-02-07" WHERE login = "login";
5. Pobieranie danych aktualnie zalogowanego użytkownika:
SELECT login , password, name, surname, email, city, birthdate, logdate, regdate FROM users NATURAL JOIN sessions WHERE sessions.sessionID = 1234;
6. Tworzenie nowej grupy rozliczeniowej:
INSERT INTO groups(groupname, groupowner, autooptymalization) VALUES("nazwagrupy", "login", FALSE);
INSERT INTO groupmembers VALUES("login",12);
7. Usuwanie grupy rozliczeniowej:
DELETE FROM groupmembers WHERE groupID = 12;
DELETE FROM groups WHERE groupID = 12;
8. Pobieranie informacji o grupach roliczeniowych:
SELECT groupID, groupname, groupowner, autooptymalization FROM groups WHERE groupowner = "login";
SELECT name, surname, login FROM groupmembers NATURAL JOIN users WHERE groupmembers.groupID = 12;
9. Tworzenie nowego zaproszenia / prośby o dołączenie do grupy:
INSERT INTO groupjoin(groupjoinowner, groupID, login, invitation) VALUES("login", 12, "loginkogos", TRUE);
10. Anulowanie zaproszenia / prośby o dołączenie do grupy:
DELETE FROM groupjoin WHERE groupjoinID = 123;
11. Akceptacja zaproszenia / prośby o dołączenie do grupy:
INSERT INTO groupmembers VALUES("login",12);
DELETE FROM groupjoin WHERE groupjoinID = 123;
12. Pobieranie danych o otrzymanych zaproszeniach (analogicznie wysłanych zaproszeniach, otrzymanych prośbach, wysłanych prośbach):
SELECT groupname, name, surname, groupjoinID FROM groupjoin NATURAL JOIN groups NATURAL JOIN users WHERE groupjoin.invitation = TRUE AND groupjoin.groupjoinowner <> "login";
13. Tworzenie nowego zobowiązania:
INSERT INTO commitments (commitmentname, obligor, obligee, groupID, commitmentowner, sum, comment, commitmentdate, status ) VALUES("zobowiazanie", "login_dłużnika", "login", 12, , "login", 125, "Komentarz do zobowiazania", 1);
14. Usuwanie zobowiązania:
DELETE FROM commitments WHERE commitmentID = 5;
15. Zmiana statusu zobowiązania:
UPDATE commitments SET status = 2 WHERE commitmentID = 5;
16. Pobieranie danych o otrzymanych zobowiązaniach:
SELECT commitmentID, commitmentname, obligor, obligee, groupID, commitmentowner, sum, comment, commitmentdate, status FROM commitments WHERE commitments.status = 2 AND commitmentowner <> "login" AND (obligor = "login" OR obligee = "login");