Avatar billede spookztar Nybegynder
29. juni 2006 - 21:39 Der er 7 kommentarer

Cascade/restrict nødvendigt her? (og lidt nøgler og NF)

Hej eksperter,

Jeg har ikke rigtigt noget erfaring med DB design, og jeg er vist lidt in over my head her. Jeg har følgende problemstilling:

Jeg er ved at lave en bandDB til et site hvor personer kan have flere roller, musiker, distributør, arrangør, VIP osv. Hvis jeg sletter et band, og en eller flere personer stadig er med i andre bands i DB'en - eller stadig har andre roller i forehavendet, hvorledes undgår jeg så at de bliver slettet før at deres tilknytning er endeligt overstået? Dette er den relevante del af den kode jeg har lavet indtil videre:

CREATE TABLE band(
bandID INT PRIMARY KEY AUTO_INCREMENT,
sign_date INT VARCHAR(3),
turn_no INT VARCHAR(3),
site_url VARCHAR(100),
song_url VARCHAR(100),
notes VARCHAR,
country VARCHAR (30),
bandname VARCHAR (50),
style VARCHAR (25),
labelname VARCHAR (50),
bold VARCHAR (1),
promobox VARCHAR (1),
cd_count VARCHAR (3),
grade VARCHAR (10),
);
CREATE TABLE person(
personID INT PRIMARY KEY AUTO_INCREMENT,
passwd VARCHAR (128),
membername VARCHAR (50),
username VARCHAR (30),
mail VARCHAR (40),
phone VARCHAR (30),
address VARCHAR (50),
zip VARCHAR (20),
cityname VARCHAR (40),
state VARCHAR (30),
country VARCHAR (30),
);
-- many-to-many connector table between "band" and "person" tables.
CREATE TABLE band/person(
bandID INT,
personID INT,
PRIMARY KEY (bandID, personID),
FOREIGN KEY (bandID) REFERENCES band(bandID),
FOREIGN KEY (personID) REFERENCES person(personID),
);
CREATE TABLE personrole(
roleID INT PRIMARY KEY AUTO_INCREMENT,
personrole VARCHAR(10),
UNIQUE KEY personrole (personrole),
);
-- many-to-many connector table between "person" and "personrole" tables.
CREATE TABLE person/personrole(
personID INT NOT NULL,
personroleID INT NOT NULL,
FOREIGN KEY (personID) REFERENCES person(personID),
FOREIGN KEY (personroleID) REFERENCES personrole(personroleID),
PRIMARY KEY (personID, personroleID),
);
-- many-to-many connector table end.

Dette her giver mig grå hår, så jeg håber virkelig at nogen kan hjælpe mig her.

Ang. nøgler. Er det korrekt forstået, at hvis man flytter eksempelvis postnr og by ud i en tabel for sig, skal denne nye tabel have en autonummereret primærnøgle som så også skal optræde som fremmednøgle i oprindelsestabellen? (hovedtabellen). Hvis ja, skal hovedtabellens primærnøgle og dens nyligt opståede fremmednøgle kobles sammen til en sammensat primær nøgle for at sikre sammenhæng? Hvad hvis disse er af forskellig natur? (se linkede eksempel nedenunder). Kompositnøgler må vist ikke må være af forskellig datanatur (text og integer). Korrekt?

Er feltet med den generelt gældende information (postnr, pladeselskab osv.) nok som primary key alene - lidt ligesom "language" feltet i dette eksempel: http://techrepublic.com.com/5100-6329-5034790.html# (mit eksempel band -> label er dog en-til-mange og ikke mange-til-mange, men det gør vel ikke den store forskel?) I det linkede eksempel, er nøglerne i brotabellen behøver vel ikke at være en en composite primary key, Korrekt?

Jeg håber virkelig nogen lige kan tænde lyset for mig her, da jeg lige er på nippet til at stå permanent af DB design vognen i frustration.

Hejsa.
Avatar billede spookztar Nybegynder
29. juni 2006 - 21:42 #1
Der er en UNIQUE KEY i "personrole" tabellen der er blevet anbefalet droppet fra anden side, så se bort fra den.
Avatar billede arne_v Ekspert
30. juni 2006 - 02:20 #2
nej - normalt vil man nok lade postnummer være primary key og foreign key
Avatar billede arne_v Ekspert
30. juni 2006 - 02:21 #3
du kan vist ikke bruge cascade delete med M:M
Avatar billede spookztar Nybegynder
30. juni 2006 - 18:43 #4
M:M?
Avatar billede arne_v Ekspert
30. juni 2006 - 18:58 #5
mange til mange
Avatar billede spookztar Nybegynder
01. juli 2006 - 18:31 #6
Ok... Og ellers ingen højere?
Avatar billede spookztar Nybegynder
02. juli 2006 - 23:11 #7
Jeg kan se at jeg har lavet en editeringsfejl sidst i det oprindelige indlæg. Det skulle have været:

"i det linkede eksempel, er nøglerne i brotabellen ikke at samme datanatur, så det behøver ikke være en en composite primary key i en sådan tabel, (hvis tidligere antagelse er korrekt) eller hvad?"
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester