Zaimplementowałem już część odpowiedzialną za użytkowników i dodawanie oraz edycje projektów. Jednak by kontynuować potrzebuje już tabel w bazie dotyczących podzespołów i elementów oraz odpowiednich zależności pomiędzy tymi tabelami.
(Każdy projekt zawiera wiele podzespołów. Każdy podzespół zawiera wiele elementów... - pierwszy post - obrazek)
Biorąc pod uwagę podpowiedź
CuteOne utworzyłem następującą bazę danych:
CREATE TABLE konstruktorzy
(
email varchar(40) NOT NULL PRIMARY KEY,
imie char(20) NOT NULL,
nazwisko char(30) NOT NULL,
haslo char(30) NOT NULL
) type=InnoDB;
CREATE TABLE projekty
(
nr_proj int UNSIGNED NOT NULL PRIMARY KEY,
nazwa_proj char(30) NOT NULL,
konstruktor_proj char(80) REFERENCES konstruktorzy(email),
status_proj char(4),
notka_proj text,
plik_proj text,
d_rozp_proj date NOT NULL,
d_mod_proj date NOT NULL,
d_zak_proj date NOT NULL
) type=InnoDB;
CREATE TABLE podzespoly
(
nr_podz int UNSIGNED NOT NULL PRIMARY KEY,
nazwa_podz char(30) NOT NULL,
konstruktor_podz char(80) REFERENCES konstruktorzy(email),
status_podz char(4),
notka_podz text,
plik_podz text,
d_rozp_podz date NOT NULL,
d_mod_podz date NOT NULL,
d_zak_podz date NOT NULL
) type=InnoDB;
CREATE TABLE elementy
(
nr_elem int UNSIGNED NOT NULL PRIMARY KEY,
nazwa_elem char(30) NOT NULL,
konstruktor_elem char(80) REFERENCES konstruktorzy(email),
status_elem char(4),
notka_elem text,
plik_elem text,
d_rozp_elem date NOT NULL,
d_mod_elem date NOT NULL,
d_zak_elem date NOT NULL
) type=InnoDB;
CREATE TABLE ppe
(
nr_proj int UNSIGNED NOT NULL REFERENCES projekty(nr_proj),
nr_podz int UNSIGNED NOT NULL REFERENCES podzespoly(nr_podz),
nr_elem int UNSIGNED NOT NULL REFERENCES elementy(nr_elem),
PRIMARY KEY(nr_proj, nr_podz, nr_elem)
) type=InnoDB;
INSERT INTO konstruktorzy VALUES
('r@o2.pl', 'Robert', 'Małys', sha1('rrr')),
('m@o2.pl', 'Adam', 'Adamski', sha1('mmm')),
('a@o2.pl', 'Aleksander', 'Broniek', sha1('aaa')),
('b@o2.pl', 'Bartosz', 'Cieszyński', sha1('bbb')),
('c@o2.pl', 'Cyprian', 'Dromad', sha1('ccc'));
INSERT INTO projekty VALUES
(1000, 'podnosnik', 'Małys', '66%', 'projekt wykonania podnośnika', NULL, '2010-01-21', '2010-01-27', '2010-02-19'),
(2000, 'statecznik', 'Adamski', '10%', 'projekt wykonania statecznika', NULL, '2011-03-23', '2011-04-11', '2011-05-10'),
(3000, 'silnik', 'Broniek', '12%', 'projekt wykonania silnika', NULL, '2010-02-02', '2010-02-17', '2010-02-20');
INSERT INTO podzespoly VALUES
(100, 'ramie', 'Adamski', '4%', 'podzespoly wykonywane', NULL, '2001-01-21', '2001-01-18', '2001-02-20'),
(200, 'cylinder', 'Broniek', '56%', 'podzespoly wykonywane', NULL, '2003-03-23', '2004-04-11', '2004-05-11'),
(300, 'podstawa', 'Dromad', '78%', 'podzespoly wykonywane', NULL, '2006-02-02', '2008-02-17', '2009-02-20');
INSERT INTO elementy VALUES
(10, 'śruba', 'Adamski', '4%', 'elementy wykonywane', NULL, '2001-01-21', '2001-01-13', '2001-02-20'),
(20, 'pręt', 'Broniek', '56%', 'elementy wykonywane', NULL, '2003-03-23', '2004-01-11', '2004-05-11'),
(30, 'oś', 'Dromad', '77%', 'elementy wykonywane', NULL, '2006-02-02', '2008-02-17', '2009-02-25'),
(40, 'pierścień', 'Małys', '25%', 'elementy wykonywane', NULL, '2001-01-21', '2001-03-18', '2005-07-24'),
(50, 'hak', 'Cieszyński', '13%', 'elementy wykonywane', NULL, '2005-05-11', '2004-08-11', '2004-09-13'),
(60, 'kulka', 'Broniek', '67%', 'elementy wykonywane', NULL, '2007-04-02', '2008-02-17', '2009-02-20');
INSERT INTO ppe VALUES
(1000, 100, 10),
(1000, 100, 20),
(1000, 100, 30),
(1000, 100, 40),
(1000, 100, 50),
(1000, 100, 60),
(1000, 200, 10),
(1000, 200, 20),
(1000, 200, 30),
(1000, 300, 40),
(1000, 300, 10),
(2000, 200, 20),
(2000, 200, 30),
(3000, 100, 60),
(3000, 100, 50),
(3000, 200, 50),
(3000, 300, 50),
(3000, 300, 10);
Coś tu chyba jest nieprawidłowo utworzone...
Być może źle zadaje pytania bazie, ale chcąc uzyskać wyniki otrzymuję nieprawidłowe informacje...
Np
SELECT nazwisko, nazwa_elem, nazwa_podz, nazwa_proj FROM elementy, podzespoly, projekty, konstruktorzy WHERE nazwisko='Broniek'
Zamiast wyników: silnik, cylinder, pręt, kulka otrzymuje wypisane wszystkie elementy, podzespoły i projekty.
Albo chcąc uzyskać informacje o nazwie elementu i jego numerze gdzie nr_projektu=3000 i nr_podzespołu=300 piszę:
SELECT nr_elem, nazwa_elem FROM elementy, ppe WHERE nr_proj='3000' AND nr_podz='300'
uzyskuje błędne wyniki bo wypisuje wszystkie elementy zamiast tylko: 10 śruba, 50 hak
Czy wogóle tak skonstruowana baza ma sens? Czy może powinna być zlikwidowana tabela "ppe". Wtedy nr_proj i nr_podz dałbym do tabeli elementy. A do tabeli podzespoly dałbym nr_proj i odpowiednio podpiął bym do tych wierszy klucze obce wskazujące na tabele nadrzędne.