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.