Skocz do zawartości

Bazy danych


wwosik

Rekomendowane odpowiedzi

​3. Wyciągnięcia Miasta do oddzielnej tabeli kompletnie nie rozumiem. Jedynym celem było chyba tylko skomplikowanie schematu. Zobacz, że ulica została u Dziecka a Miasto zostało sztucznie wyciągnięte.

 

Dlaczego uważasz, że miasto w oddzielnej tabeli jest złe (pomijając już fakt, że ulica została)? Masz uporządkowane dane zeslownikowane, brak redundancji.

Odnośnik do komentarza

 

​3. Wyciągnięcia Miasta do oddzielnej tabeli kompletnie nie rozumiem. Jedynym celem było chyba tylko skomplikowanie schematu. Zobacz, że ulica została u Dziecka a Miasto zostało sztucznie wyciągnięte.

 

Dlaczego uważasz, że miasto w oddzielnej tabeli jest złe (pomijając już fakt, że ulica została)? Masz uporządkowane dane zeslownikowane, brak redundancji.

 

Decyzja projektowa. Celowo denormalizuję celem uproszczenia struktury. Moim skromnym zdaniem w tym przypadku na adres wystarczyłoby jedno pole tekstowe. Co innego gdyby to była siatka połączeń komunikacyjnych czy coś.

Odnośnik do komentarza

Jak pisał lindros - w podanym przez ciebie schemacie się nie da. Musisz stworzyć pośrednią tabelę, z dwoma kluczami obcymi: id_dziecka i id_opiekuna. W ten sposób dziecko o id XXX będzie mogło mieć więcej niż jednego opiekuna, przez wpis do tej tabeli:

id_dziecko | id_opiekun
XXXX         | AAAA
XXXX         | BBBB

Co rozwiąże też kolejny problem, gdzie jeden opiekun może mieć przypisanych kilkoro podopiecznych (np. matka dwojga dzieci).

 

EDIT: jest teoretycznie możliwość rozwiązania problemu bez dodatkowej tabeli, tzn wpisywanie w id_opiekun kilku kluczy obcych np po przecinku, ale wtedy niemożliwe jest stworzenie relacji na modelu, a pokazywanie danych jest wtedy albo przez jakiś bardziej zaawansowany skrypt (rozbicie pola na poszczególne id w tabeli tymczasowej i połączenie z tabelą opiekunów), albo przez zewnętrzną aplikację.

Odnośnik do komentarza

Access żąda obowiązkowo klucza głównego do tabeli? Bo jak nie, to jest niepotrzebny. Ale nie przeszkadza.

 

Relacja powinna być Dziecko.Identyfikator - OpiekunDziecko.Id_dziecko i OpiekunDziecko.Id_opiekun - Opiekun.Identyfikator. Nie wiem, czy tak jest, ale z diagramu tak nie wynika.

 

Ale tak, o to chodziło.

Odnośnik do komentarza

Niby tak mam, ale coś mi nie pasuje.

 

Jak mam stworzyć w takim razie kwerendę, która wyświetli mi dzieci przypisane pod opiekunów?

 

Mam tabele dziecko, tam jest ID, nazwisko, imię, data ur, ulica, id_miasta, nr_domu, nr_mieszkania, data_przyjęcia, id_grupy

 

Tabela OpiekunDziecko ma ID, id_dziecko i id_opiekun

 

Tabela Opiekun ma Id, id_formyopieki, nazwisko, imię, kontakt, adres

 

Relacja idzie:

 

z tabeli Dziecko Identyfikator do Tabeli OpiekunDziecko Id_dziecko, z tabeli OpiekunDziecko id_opiekun do tabeli Opiekun Identyfikator.

Odnośnik do komentarza

Ale chcesz dane dzieci, które są pod opieką konkretnego opiekuna, czy wszystkie dzieci, które mają opiekuna? Jak to pierwsze to chyba coś takiego:

 

 

SELECT Dziecko.Imie, Dziecko.Nazwisko (etc.)
FROM Dziecko INNER JOIN OpiekunDziecko
ON Dziecko.Id = OpiekunDziecko.Id_dziecko
INNER JOIN Opiekun
ON OpiekunDziecko.Id_opiekun = Opiekun.Id
WHERE Opiekun.Imie ='XXX' AND Opiekun.Nazwisko = 'YYY' (czy tam po jakich danych chcesz ich szukać)

 

 

Czymś takim wyświetlisz obok siebie imiona i nazwisko dzieci i przypisanych do nich opiekunów:

 

SELECT Dziecko.Imie, Dziecko.Nazwisko, Opiekun.Imie, Opiekun.Nazwisko
FROM Dziecko INNER JOIN OpiekunDziecko
ON Dziecko.Id = OpiekunDziecko.Id_dziecko
INNER JOIN Opiekun
ON OpiekunDziecko.Id_opiekun = Opiekun.Id

 

Jeszcze może coś takiego do znalezienia dzieci bez opiekuna (analogicznie łatwo przerobić na dzieci z opiekunem):

 

SELECT DISTINCT Dziecko.Id,Dziecko.Imie, Dziecko.Nazwisko
FROM dbo.Dziecko, dbo.OpiekunDziecko
WHERE Dziecko.Id NOT IN (SELECT Id_dziecko FROM dbo.OpiekunDziecko)

Odnośnik do komentarza
  • 3 lata później...

Korzystał ktoś z opcji TRIGGER, aby tworzyć archiwum hmm działać (chodzi o UPDATE) ? Niby mam "gotowca", ale w mysql mi to nie przechodzi:

 

CREATE TABLE `tabela` (
  `id` int NOT NULL AUTO_INCREMENT,
  `kolumna1` varchar(16) NOT NULL,
  `kolumna2` int DEFAULT NULL,
  PRIMARY KEY (`ID`)
);

 

 

CREATE TABLE `tabela_historia` (
  `id` INT NOT NULL AUTO_INCREMENT AUTO_INCREMENT,
  `id_tabela` INT NOT NULL,
  `zmiana` enum('insert','update','delete') NOT NULL,
  `czas` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `kolumna1` varchar(16) DEFAULT NULL,
  `kolumna2` int DEFAULT NULL,
  PRIMARY KEY (`id`)
);

 

CREATE TRIGGER `tabela_update` AFTER UPDATE ON `tabela`
FOR EACH ROW
BEGIN
    INSERT INTO tabela_historia (id_tabela, zmiana, kolumna1, kolumna2)
    VALUES (NEW.id, 'update', NEW.kolumna1, NEW.kolumna2);
END;
 


 

MySQL zwrócił komunikat: Dokumentacja

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 5 

 

Odnośnik do komentarza

Dołącz do dyskusji

Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.

Gość
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić obrazków. Dodaj lub załącz obrazki z adresu URL.

Ładowanie
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...