Alternativt kan man ersätta entitetstypen Fika med ett trevägssamband mellan Person, Kopp och Paus.
Person(Nr, Namn)
Telefonnummer(Person, Telefonnummer)
Kopp(Nr, Färg, Storlek, Beskrivning)
Paus(Nr, Datum, Starttid, Sluttid)
Fika(Nr, Person, Kopp, Paus)
I tabellen Fika bildar Paus och Person en sammansatt alternativnyckel, eftersom det stod i uppgiften att varje person bara använder en kaffekopp per fikapaus. Om man också tänker sig att varje kopp bara används av en person per fikapaus, bildar även Paus och Kopp en sammansatt alternativnyckel.
Referensattribut:
Telefonnummer.Person till Person.Nr
Fika.Person till Person.Nr
Fika.Kopp till Kopp.Nr
Fika.Paus till Paus.Nr
SQL-kommandon för att provköra:
drop table Fika; drop table Paus; drop table Kopp; drop table Telefon; drop table Person; create table Person (Nr integer not null primary key, Namn varchar(10) not null); insert into Person values (1, 'Adam'); insert into Person values (2, 'Bertil'); insert into Person values (3, 'Cesar'); insert into Person values (4, 'David'); insert into Person values (5, 'Erik'); create table Telefon (Id integer not null primary key, Person integer references Person(Nr), Telefonnummer varchar(10) not null, unique(Person, Telefonnummer)); insert into Telefon values (1, 1, 'A-1'); insert into Telefon values (2, 1, 'A-2'); insert into Telefon values (3, 1, 'A-3'); insert into Telefon values (4, 2, 'B-1'); insert into Telefon values (5, 2, 'B-2'); insert into Telefon values (6, 3, 'C'); create table Kopp (Nr integer not null primary key, Farg varchar(10) not null, Storlek integer not null, Beskrivning varchar(10) not null); insert into Kopp values (1, 'Grön', 10, 'Ful'); insert into Kopp values (2, 'Grön', 10, 'Fin'); insert into Kopp values (3, 'Blå', 10, 'Ful'); insert into Kopp values (4, 'Blå', 10, 'Fin'); insert into Kopp values (5, 'Gul', 10, 'Sned'); create table Paus (Nr integer not null primary key, Datum date not null, Starttid time not null, Sluttid time not null, unique(Datum, Starttid, Sluttid)); insert into Paus values (1, DATE'2012-03-03', TIME'10:10:00', TIME'10:25:00'); insert into Paus values (2, DATE'2012-03-03', TIME'12:00:00', TIME'12:27:00'); insert into Paus values (3, DATE'2012-03-03', TIME'15:10:00', TIME'15:45:00'); create table Fika (Nr integer not null primary key, Person integer references Person(Nr), Kopp integer references Kopp(Nr), Paus integer references Paus(Nr), unique(Person, Kopp, Paus)); insert into Fika values (1, 1, 1, 1); insert into Fika values (2, 1, 1, 2); insert into Fika values (3, 2, 2, 1); insert into Fika values (4, 2, 3, 2); insert into Fika values (5, 2, 4, 3); insert into Fika values (6, 3, 3, 1);
b) Genom att den som skapar databasen formulerar integritetsvillkor och anger dem för databashanteraren, kan databashanteraren automatiskt upprätthålla dessa villkor. Det underlättar för dem som arbetar med databasen, eftersom de inte själva behöver kontrollera villkoren varje gång de gör en ändring i databasen, och eftersom de kan lita på att villkoren alltid är uppfyllda. Det gäller både den som sitter och arbetar direkt mot databasen med SQL-kommandon, och den som skriver ett applikationsprogram som arbetar mot databasen.
c) Några förslag:
select Telefonnummer from Person, Telefon where Person.Nr = Telefon.Person and Person.Namn = 'Anna Andersson';
b) Det finns bara en Bo Berg som jobbar här. Vilka gröna kaffekoppar har han någon gång använt?
select distinct Kopp.Nr from Person, Kopp, Fika where Person.Nr = Fika.Person and Person.Namn = 'Bo Berg' and Kopp.Nr = Fika.Kopp and Kopp.Farg = 'Grön';
c) Finns det några kaffekoppar som aldrig är använda? Vi vill veta de kaffekopparnas nummer och färg.
select Nr, Farg from Kopp where Nr not in (select Kopp from Fika);
d) Vad heter den person som har deltagit vid flest fikapauser?
create view AntalFikapauser as select Person.Nr, Person.Namn, count(*) as Antal from Fika, Person where Fika.Person = Person.Nr group by Person.Nr, Person.Namn; select Namn from AntalFikapauser where Antal = (select max(Antal) from AntalFikapauser);