Jeg kunne godt tænke mig en anden løsning uden redundans (data der bruges igen og igen, eks. prod4321) og uden nøgler der er tekststrenge.
Hvis jeg har to tabeller
model og
bilmaerke og
model peger over i
bilmaerke:
create table bilmaerke
(
ref int identity(1,1),
navn nvarchar(50)
constraint [pk_bilmaerke] primary key(ref)
)
create table model
(
ref int identity(1,1),
bilmaerke_ref int not null,
navn nvarchar(50),
aktiv bit not null constraint [df_model_aktiv] default(1),
constraint [pk_model] primary key(ref),
constraint [fk_model_bilmaerke] foreign key(bilmaerke_ref) references bilmaerke(ref)
)
I tabellerne er "ref" altid primærnøgle (altså den værdi der unikt identificerer recorden). En fremmednøgle er det felt indeholder en anden tabels primærnøgle. Det felt kaldes altid tabellens navn efterfulgt af
_ref, eksempelvis
bilmaerke_ref. På den måde kan jeg altid se hvilken tabel der refereres til.
Den anden ting er de constraints der defineres.
pk_<tabelnavn> for
Primary Key,
fk_<tabelnavn>_<fr.tabelnavn> for
Foreign Key og
df_<tabelnavn>_<feltnavn> for
Default. Med de simple regler har jeg fuldt styr på mine tabeller og deres relationer.
Fordi der er oprettet constraints kan du heller ikke slette en bilmaerke-record hvis der er model-records der bruger den (men så kan du bruge kaskade sletning, men lad være med det til at begynde med!)
Indsætter lige lidt data (kommentarer starter med --)
insert into bilmaerke(navn) values('Ford'); -- ref = 1
insert into bilmaerke(navn) values('Fiat'); -- ref = 2
insert into bilmaerke(navn) values('Cisitalia'); -- ref = 3
insert into bilmaerke(navn) values('Delahaye'); -- ref = 4
insert into model (bilmaerke_ref, navn) values(1,'Fiesta');
insert into model (bilmaerke_ref, navn) values(1,'Taunus');
insert into model (bilmaerke_ref, navn) values(1,'Sierra');
insert into model (bilmaerke_ref, navn) values(1,'Granada');
insert into model (bilmaerke_ref, navn) values(1,'Mondeo');
insert into model (bilmaerke_ref, navn) values(2,'Punto');
insert into model (bilmaerke_ref, navn) values(2,'Panda');
insert into model (bilmaerke_ref, navn) values(2,'Multipla');
insert into model (bilmaerke_ref, navn) values(2,'500');
insert into model (bilmaerke_ref, navn) values(3,'D46');
insert into model (bilmaerke_ref, navn) values(3,'202');
insert into model (bilmaerke_ref, navn) values(3,'202MM');
insert into model (bilmaerke_ref, navn) values(3,'202SMM');
insert into model (bilmaerke_ref, navn) values(4,'Type 32, 1909');
insert into model (bilmaerke_ref, navn) values(4,'Type 32, 1910');
insert into model (bilmaerke_ref, navn) values(4,'Tourer, 1925');
insert into model (bilmaerke_ref, navn) values(4,'135M Roadster');
insert into model (bilmaerke_ref, navn) values(4,'135M Coupe');
Hvis du nu vil se modellerne af Delahaye så skal du bare skrive
select navn
from model
where (bilmaerke = 4)
eller via navn
select m.navn
from model m
join bilmaerke bm on (bm.ref = m.bilmaerke_ref)
where (bm.navn = 'Delahaye')