Avatar billede anders_cp Nybegynder
21. oktober 2009 - 12:51 Der er 4 kommentarer og
1 løsning

Null-værdi i fremmednøgle

Hejsa
Jeg har følglende scenarie:
To tabeller
a)
Payement
---------
PaymentID - PRIMÆRNØGLE
Description
.
.
F_PostalCode - FREMMEDNØGLE til posttabel
F_F_CountryID - FREMMEDNØGLE til posttabel
-------------------------------------------

b)
PostalCodes
------------
PostalCode (f.eks. 2100) - PRIMÆRNØGLE
City (f.eks. Østerbro)
CountryID (f.eks. 1 - danmark) - PRIMÆRNØGLE
---------------------------------------------

Min tanke er så at der i Payment-tabellen kan forekomme scenarier hvor der ikke er nogen adresse, dvs. ingen reference til posttabellen. Medens der kan forekommer adresser, dvs. der ønskes referentiel integritet mellem Payment og PostalCodes.

Det er lykkedes mig at oprette de to fremmednøgler som tillader null.

Meeen - og her kommer kernen i mit problem - når jeg opretter et ugyldigt postnummer i payment-tabellen, tillades postnummeret (det ønskes ikke - her ønskes en fejl).
Hvis jeg ikke tillader null-værdier får jeg ingen fejl.

Spørgsmål:
Det jeg vil  - tillade null og hvis der ikke er null lave referentirel integritet - kan det lade sig gøre?
Er det en dum måde at lave DB-design på?
21. oktober 2009 - 14:35 #1
Ja, jeg mener at det er din tabel struktur du skal tilpasse.  Siden en payment kan eksistere uden adresse saa skal din Payment-tabel kun indeholde felterne paymentid og description.  I en saerskilt PaymentAddress tabel har du saa paymentaddressid, paymentid, postcode, countryid.  I PaymentAddress tabellen er paymentid fremmednoegle til Payment tabellen og postcode og countryid er fremmednoegler til postalcode tabellen.  (Du kunne saa gaa videre og lave en country tabel med countryid og country og saa i paymentaddress tabellen erstatte countryid med country.  Saa behoever folk ikke at huske countryid, og ved at goere country fremmednoegle til country tabellen bevares den referentiele integritet.
Avatar billede anders_cp Nybegynder
21. oktober 2009 - 15:05 #2
Jeg er helt med på hvad du mener og vil ændre min tabel-struktur som du har beskrevet. Tak for din super-duper forklaring :-)
Avatar billede janus_007 Nybegynder
21. oktober 2009 - 18:40 #3
Hvis du har oprettet en FK og tilladt NULLS så vil den da fejle hvis du prøver at oprette noget som ikke er NULL og som ikke findes i PK-tabellen.
Det forstår jeg ikke hvorfor du ikke kan få til at virke, det er skam et helt almindeligt db-design.
Avatar billede anders_cp Nybegynder
21. oktober 2009 - 21:38 #4
well nu har jeg fjernet det gamle design. Christian_Belgien overbeviste mig om at jeg havde lavet et dårligt design, som nu er lavet om ;).

Men efter hukommelsen var det noget i den stil jeg havde lavet følgende tabel, der havde reference til en post-tabel med Postalcode og CountryID:
CREATE TABLE PaymentOnline
(
    PaymentOnlineID SMALLINT IDENTITY NOT NULL PRIMARY KEY
    , GUID VARCHAR(50) NOT NULL
    , F_ActivityID    INT NOT NULL
        REFERENCES Activities(ActivityID)
   
    , Amount VARCHAR(50) NOT NULL
    , Description VARCHAR(1000) NULL DEFAULT NULL
       
    , Authmail VARCHAR(50) NULL DEFAULT NULL
    , SPemail VARCHAR(50) NULL DEFAULT NULL
    , Fullname VARCHAR(50) NULL DEFAULT NULL
    , Adress VARCHAR(50) NULL DEFAULT NULL
   
    , PostalCode VARCHAR(10) NULL
    , CountryID TINYINT NULL
     
    , IP VARCHAR(50) NULL DEFAULT NULL
    , DateTimeStamp DATETIME NOT NULL
   
    , CONSTRAINT postalCode_fk FOREIGN KEY (F_PostalCode, F_CountryID)
        REFERENCES PostalCodes(PostalCode, CountryID)
)



Hvis jeg i ovenstående tabel skrev en forkert PostalCode lykkedes det uden problemer (måske skyldes det - men det er kun et gæt - at jeg kun udfyldet den ene primærnøgle[PostalCode] og ikke begge [+CountryID])
Avatar billede janus_007 Nybegynder
22. oktober 2009 - 12:39 #5
Ahh ja, din FK er sammensat. Det kan du løse ved at lave en særskilt FK constraint på hhv. PostalCode og CountryId.

Men udover det har Christian jo ret mht. normaliseringen.. Boyce Codd ;) The key, the whole key and nothing but the key :)
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