Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


DB-design- och normaliseringsproblem

Postades av 2005-12-15 21:24:11 - Per Karlsson, i forum sql-server/msde, Tråden har 9 Kommentarer och lästs av 814 personer

Finns det någon här som är bra på db-design?

Jag vill göra en struktur som liknar följande:
<CODE>
CARS
----
PK CarId NOT NULL
CarName
...

CAR_PROPERTIES
----
PK CarId NOT NULL
PK PropertyId NOT NULL
PK CustomerId
PropertyName
PropertyValue
...

CUSTOMERS
----
PK CustomerId NOT NULL
CustName
...
</CODE>
Detta är bara ett exempel på principen, men problemet är följande:
- Jag vill använda tabellen CAR_PROPERTIES för att lagra defaultvärden för egenskaper hos olika CARS. Rader med defaultproperties skulle alltså få CustomerId = NULL, för att kunna ha relationen till CUSTOMERS
- MEN... Det går inte att ha en NULL-bar kolumn som en del av en primärnyckel.


Ska tabellen CAR_PROPERTIES ha ytterligare en kolumn med ett unikt ID som själv får utgöra primärnyckel, samt att man då implementerar logik för att garantera att kombinationen CarId-PropertyId-CustomerId är unik (via ett UNIQUE-constraint eller en trigger)?

Vad är Best Practice för att lösa denna typen av problem?


Svara

Sv: DB-design- och normaliseringsproblem

Postades av 2005-12-15 22:13:54 - Ola Lindfeldt

<b>Detta är bara ett exempel på principen, men problemet är följande:
- Jag vill använda tabellen CAR_PROPERTIES för att lagra defaultvärden för egenskaper hos olika CARS. Rader med defaultproperties skulle alltså få CustomerId = NULL, för att kunna ha relationen till CUSTOMERS
- MEN... Det går inte att ha en NULL-bar kolumn som en del av en primärnyckel.
</b>


Renast och snyggast är väl kanske att du har en helt egent tabell för defaults. Teoretiskt sett är det väl mest rätt att tänka så. Men det blir kanske lite mer jobb utan någon uppenbar vinst.
En möjlig lösning är att du ger dessa default värden CustomerId = -1
Och att du sen har en "DefaultCustomer" med detta id (som anändaren aldrig får se...)

Lite äpplen och päron kanske.. med vafan, det är väl inte en rymdstation du ska bygga? ;-)


<b>
Ska tabellen CAR_PROPERTIES ha ytterligare en kolumn med ett unikt ID som själv får utgöra primärnyckel, samt att man då implementerar logik för att garantera att kombinationen CarId-PropertyId-CustomerId är unik (via ett UNIQUE-constraint eller en trigger)?</b>


Båda sätten är ok, men mycket talar för att det är klokt att ge varje tabell ett unikt id-fält.
Säg att du vill bygga ut datamodellen ytterligare t ex införa en tabell CarProperyJpgImage. Då blir främmande nyckel i den tabellen hellre en CarPropID än (CarId-PropertyId-CustomerId).
Enklare, snyggare, bättre prestand vid JOIN osv.




Svara

Sv:DB-design- och normaliseringsproblem

Postades av 2005-12-15 23:52:47 - Per Karlsson

Nej, knappast någon rymdstation, men en expansion i en stor produkt för ett programvaruföretag, där det finns ganska strikta policies för db-normalisering och -relationer.
Därför tvivlar jag på din första lösning, även om den skulle fungera. Men en renare lösning skulle vara bättre...

Om man nu tänker sig att ha en extra id-kolumn - är det möjligt att implementera ett unique-constraint som klarar av de tre övriga kolumnerna?

/Pelle


Svara

Sv: DB-design- och normaliseringsproblem

Postades av 2005-12-16 09:36:21 - Mikael Wedham

1-Strikt policy för normalisering
2-"Primärnycklar" som måste tillåta null

Dessa saker verkar inte gå hand i hand...

/micke


Svara

Sv:DB-design- och normaliseringsproblem

Postades av 2005-12-16 09:54:49 - Per Karlsson

Nej, precis vad jag menade. Det är därför jag efterlyser bra idéer kring denna typ av problem.

/Pelle


Svara

Sv: DB-design- och normaliseringsproblem

Postades av 2005-12-16 10:39:46 - Mikael Wedham

Är inte relationen mellan Car och Custoemr den som skall gälla?

När du väljer en Car, vet du (väl) vilken customer som äger den? Då är det inte ett bekymmer, för relationen Car-CarProperties är då 1-oo och funkar som vanligt: Defaultvärden saknas i tabellen helt enkelt (eller så kan du ha DEFAULT constraints)

Som det ser ut kan en Car ägas av olika Customers samtidigt - MEN den kan då ha samma eller olika properties som sig själv! Och den kan både ha - och inte ha en property, samtidigt som den ägs(eller inte ägs) av en eller flera kunder (eller inte)... Jag förstår att du inte riktigt är med :)

Förslag:
Cars -Unika bilar.
Customers - Relaterar till Cars
CarProperties- Relaterar till Cars.
Om du vill ha en lista med Bilmodeller eller nåt, så får du ha en många till många relation. Då behöver du en Models-tabell också, som relaterar till Cars - fast åt "andra hållet"

/micke


Svara

Sv:DB-design- och normaliseringsproblem

Postades av 2005-12-16 11:35:23 - Per Karlsson

Tack för förslaget! Men...

Tänk dig att en Car är en hyrbil som kan hyras av noll, en eller flera Customers. En CarProperty kan t.ex. vara milkostnaden för att hyra bilen, en annan kan vara hyravtalets startdatum osv.

Defaultvärden för dessa properties lagras i CarProperties och kan ändras av biluthyrningsfirman som använder programmet (Därför lämpar sig inte default constraints). Där ett värde lagras för en Customer så överstyr detta defaultvärdet.

Fler bra lösningsförslag tas tacksamt emot.

/Pelle


Svara

Sv: DB-design- och normaliseringsproblem

Postades av 2005-12-16 15:28:20 - Marcus Gus


<b>Tänk dig att en Car är en hyrbil som kan hyras av noll, en eller flera Customers. En CarProperty kan t.ex. vara milkostnaden för att hyra bilen, en annan kan vara hyravtalets startdatum osv.</b>

Detta gäller enbart fallet med hyrbilar. Om jag skulle designa ett sådant system så vill jag att det data som gäller då kontraktet av hyresavtalet upprättades skall sparas undan på något sätt och att det inte kan förändras även om data i "grundtabeller" ändras. Tänk tex den vanliga order, orderrad, Item exemplet, lägger jag en order på en hammare som kostar 15,90:- så vill inte jag att orderns värde skall föndras bara för att man uppdaterar Item med ett nytt pris.

Tänkbar lösning om ej snygg

<code>
Agreement_PROPERTIES
----
PK CarId NOT NULL
PK PropertyId NOT NULL
PK CustomerId
PropertyValue
----

Car_PROPERTIES
----
PK CarId NOT NULL
PK PropertyId NOT NULL
PropertyName
DefaultPropertyValue
----
</code>
I car_properties lägger du defaultpratmetrar för din hyrbil, när du skapar ett nytt hyresavtal gör du en insert på dem till Agreement_PROPERTIES som representerar hyresavtalet. På det sättet får du data som inte kommer att förändras när defaultdata ändras och en lösning som inte ligger alltför långt ifrån din nuvarande lösning. Då har du separareat defaultdata från data som faktiskt gäller för ett hyreskontrakt.


Svara

Sv:DB-design- och normaliseringsproblem

Postades av 2005-12-16 18:17:16 - Per Karlsson

Det här med bilar och hyresavtal är bara ett exempel. Applikationen som jag ska bygga ut har inget alls med bilar att göra... det är principen jag är ute efter.

Vad sägs då om den här lösningen:
<CODE>
CARS
----
PK CarId NOT NULL
CarName
...

CAR_PROPERTIES
----
PK PropertyId NOT NULL
PropertyName
...

CAR_AGREEMENT
----
PK CarPropertyId NOT NULL
CarId NOT NULL
PropertyId NOT NULL
CustomerId
PropertyValue
...

CUSTOMERS
----
PK CustomerId NOT NULL
CustName
...
</CODE>
Då måste man iofs skapa ett UNIQUE-constraint på CarId, PropertyId och CustomerId i CAR_AGREEMENT, men jag har nu kollat upp att det går att göra. En av de stora fördelarna med denna typ av constraints är att de går att applicera på null-bara kolumner. Jag förstår faktiskt inte alls varför detta inte går att göra med en primärnyckel.

Vilken lösning är bäst: att lagra default-värdet (som ska gå att ändra inifrån programmet) i CAR_PROPERTIES (som i Marcus exempel) eller att lagra det i CAR_AGREEMENT med CustomerId = NULL (som i mitt exempel)?
När man bara har ett fält (PropertyValue) som ska kunna existera dels som default-värde och dels per avtal, så framstår Marcus lösning som snyggare. Om det däremot finns fler värden förutom PropertyValue som kan variera per avtal, t.ex. PropertyIsVisibleInAgreement, PropertyIsChangeableInAgreement mm - då blir det inte lika självklart. Då skulle ju ett flertal kolumner finnas upprepade i två tabeller. Är det bra? Det kräver ju olika logik beroende på om det är ett defaultvärde som ändras eller ett avtalsvärde. Samma sak vid hämtning.


Svara

Sv: DB-design- och normaliseringsproblem

Postades av 2005-12-22 21:41:51 - Per Karlsson

Gick till slut på Marcus lösning. Båda varianterna funkar, så det var bara att välja en.


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 619
27 953
271 709
559
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies