HDSoftware Skrevet 13. februar 2009 Del Skrevet 13. februar 2009 (endret) Hei og hå folkens Jeg er i en situasjon der jeg trenger å hente data fra flere tabeller inn i samme view. Det er ingen definerte relasjoner mellom disse da de er basert på forskjellige kriterier. Datamodellen har følgende tabeller av interresse: Dokumenter, Kunder, Prosjekter. I tillegg har vi en tabbel kallt KundeRelations. Denne er koblet til de forskjellige entitetene. Felles for alle postene i KundeRelations er at de alltid har en kobling til Kunder. Relasjonen er litt spesiell fordi den kobler til entitetene på følgende måte: Kunderelation.EntityTypt INT Kunderelation.EntityGUID VARCHAR(36) Alle tabellene bruker GUID som identifikator. Derfor vil feltet EntityGUID bli brukt som "relasjon" mellom KundeRelation og alle andre entiteter. I tillegg er det slik at det på Dokumenter er et felt som heter ProjectGUID. Dette for å koble dokumenter mot Prosjekter. Så til problemet: Jeg trenger å finne alle dokumentene som er relatert mot en valgt kunde. Jeg skal med andre ord ikke bare ha dokumentene som er relatert gjennom KundeRelations.EntityGUID, men også dokumentene som igjen er tilknyttet prosjektene som kunden måtte ha. Det betyr følgende: Kunder ->> KundeRelations <-> Dokumenter Kunder ->> Project ->> Dokumenter Den siste linjen gjelder fordi kundens GUID også er registrert på prosjektet. Videre må dette SELECT statementet kunne defineres som et VIEW på SQL serveren fordi utviklingsverktøyet jeg bruker klarer ikke bruke STOREDPROCEDURE som "tabell" All hjelp mottas med stor takk Endret 13. februar 2009 av HDSoftware Lenke til kommentar
blackbrrd Skrevet 14. februar 2009 Del Skrevet 14. februar 2009 Hvorfor skal du bruke en nøkkel på 36 tegn til å koble sammen to tabeller? Det lukter av dårlig databasedesign. varchar(36) opptar 36 bytes, mens en integer vil oppta 4 bytes. Mao 9 ganger så stort plassbehov. Mao blir indeksen 9 ganger så stor. Noe som igjen fører til at du må ha 9 ganger så mye minne for å holde indeksen i minnet. Du må nesten vise oss create table statementet til de fire tabellene for at det skal være mulig å hjelpe deg med å lage spørringen du vil ha. Lenke til kommentar
G2Petter Skrevet 15. februar 2009 Del Skrevet 15. februar 2009 (endret) blackbrrd: enkelte rammeverk bruker primærnøkler med varchar(36) (32 tegn med 4 bindestreker for å dele opp) til å lagre nøkler som skal være unike for hele databasen, ikke bare tabellen. Jeg vet ikke om dette er tilfellet her, men det er en mulig forklaring. Endret 15. februar 2009 av G2Petter Lenke til kommentar
HDSoftware Skrevet 17. februar 2009 Forfatter Del Skrevet 17. februar 2009 G2Petter. Det stemmer helt på en prikk. Trodde dette kom klart ut av mitt innlegg da jeg hele tiden snakker om GUID'er og en GUID er definert som STRING(36) Lenke til kommentar
blackbrrd Skrevet 17. februar 2009 Del Skrevet 17. februar 2009 Vel, en guid er egentlig på 16 byte, dvs et 128bit tall. Ser ingen grunn til å lagre det som 36 byte i en varchar(36). Ref: http://en.wikipedia.org/wiki/Globally_Unique_Identifier Lenke til kommentar
kaffenils Skrevet 17. februar 2009 Del Skrevet 17. februar 2009 (endret) Blackbrrd har selvsagt helt rett. At SQL Server Management Studio presenterer GUIDen slik: 6F9619FF-8B86-D011-B42D-00C04FC964FF, betyr ikke at det lagres som en streng, på samme måte som en dato+tid ikke lagres som en human-readable streng, men som enten 4(shortdatetime) eller 8(longdatetime) bytes. GUIDen over består av 16 bytes, selv om presentasjonen av den er 36 bytes. Kjør følgende og sjekk output fra de to nederste spørringene. declare @u uniqueidentifier select @u=newid() select @u select convert(varbinary(16),@u) Endret 17. februar 2009 av kaffenils Lenke til kommentar
HDSoftware Skrevet 18. februar 2009 Forfatter Del Skrevet 18. februar 2009 Det stemmer. Men jeg har ikke laget algoritmen slik (ser at jeg burde ha gjort det). Vi har nemlig laget GUID produksjo0nen selv og følger ingen standard på dette. Vår GUID er bygget opp av helt bestemte verdier. Men ja, jeg kunne godt laget den om slik at den ble lagret som en BYTE(16) Men samme det. Problemet er løst ;-) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå