Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

Database design issue: foreign keys met onbekende waarden

Pagina: 1
Acties:

  • INTERPOL
  • Registratie: April 2006
  • Laatst online: 05-01-2024
Stel ik heb een kleine database als volgt:

Afbeeldingslocatie: http://i30.tinypic.com/1jm3ja.jpg

Nu heb ik ook tracks waarvoor ik geen artiest of album weet.
Hoe kan ik dit oplossen zonder null values te gebruiken ?

  • whoami
  • Registratie: December 2000
  • Laatst online: 13:42
Als je geen NULL wilt gebruiken, dan kan je een 'unknown artist' en een 'unknown album' record toevoegen.
Echter, als je dat wil doen, zou ik toch eerst eens mezelf de vraag stellen of mijn data-model wel goed is.

Zowiezo zou ik me ook wel eens de vraag stellen of dat wel kan: een track (die imho toch altijd met een album geassocieerd is, anders is het geen track [als ik het goed heb, dateert die term nog vanuit de vinyl-periode (spoor)) waarvan je het album niet kent.

https://fgheysels.github.io/


  • INTERPOL
  • Registratie: April 2006
  • Laatst online: 05-01-2024
Inderdaad, m'n voorbeeld is in die zin slecht gekozen dat er inderdaad
altijd wel een trackid aan een album kan gekoppeld worden.
Ik probeer eigenlijk een 'generieke' oplossing te vinden.
Het gaat eigenlijk niet om het voorbeeld, maar wel om
het probleem dat hem stelt, namelijk een oplossing
zien te vinden voor een constraint waarvoor één van de keys
nog niet gekend is...

Verwijderd

Geef dan eens aan waarom je geen NULL zou gebruiken?

  • INTERPOL
  • Registratie: April 2006
  • Laatst online: 05-01-2024
Misschien omdat de aanwezigheid van NULL in een database zo i zo
wijst om een slecht datamodel ? of is dat ook veralgemen wat ik doe ?

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 19-11 14:59
Als het trackid het enige is wat je van een track op wil slaan dan zou ik gewoon een null waarde gebruiken. Heb je nog meer informatie wat je over een track wil opslaan (bijvoorbeeld lengte ofzo) dan zou ik de tracks tabel als koppel tabel gebruiken. En als je dan geen artiest/album weet voor een track vul je daar gewoon geen record voor in.

Hail to the king baby!


  • whoami
  • Registratie: December 2000
  • Laatst online: 13:42
Dus, als ik het nu goed begrijp zoek je een oplossing voor een probleem dat zich nu niet stelt ?

https://fgheysels.github.io/


  • INTERPOL
  • Registratie: April 2006
  • Laatst online: 05-01-2024
Het probleem stelt zich wel, alleen niet toegepast op een mp3-collectie... :)

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Is het dan niet handiger om gewoon het echte probleem voor te leggen? :)

Verwijderd

Het probleem is het missen van een waarde in een FK, voor het probleem maakt het dan toch niet uit of hij mp3's of olifanten als voorbeeld neemt?

Ik zou toch voor een record 'onbekend' gaan ofzo, hoe zou je zoiets anders op moeten lossen?
Hoewel het wel een beetje weuzig ontwerp is zo

[ Voor 10% gewijzigd door Verwijderd op 09-03-2008 15:15 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 17:20

Janoz

Moderator Devschuur®

!litemod

INTERPOL schreef op zondag 09 maart 2008 @ 14:20:
Misschien omdat de aanwezigheid van NULL in een database zo i zo
wijst om een slecht datamodel ? of is dat ook veralgemen wat ik doe ?
Het aanwezig zijn van NULL is absoluut niet een teken van een slecht database model. NULL heeft een heel duidelijke functie en als hij daarvoor wordt gebruikt valt dat niet als 'slecht' uit te leggen.

Waar ik eerder een beetje vreemd tegenaan kijk is del artist_album tabel. Dat lijkt me wat redundant gezien die gegevens ook gewoon in track staan.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

NULL is de ideale manier zelfs om aan te geven dat iets niet aanwezig is in plaats van een initiele waarde heeft (viewCount = 0) of daadwerkelijk gevuld is (naam = 'Sjaak'). In dit geval is de koppeling niet aanwezig en is dus NULL. De reden dat je daar geen NULL zou willen hebben, is omdat je geen orphan records wilt en altijd de relatie tussen track, arties en album afdwingt via foreign key constraints.

Dan kun je dus geen track inserten zonder de artiest en album id's mee te geven, en kun je er voor kiezen dat de track automatisch verdwijnt zodra je de artiest of het album verwijdert, of juist een album of artiest niet verwijderd kan worden zonder dat je eerst de bijbehorende tracks aangepast of verwijderd hebt.

Gooi die rare koppeltabel er uit, als je volgens de regels normaliseert dan verdwijnt die sowieso vanzelf. Tenzij je wil weten of een bepaalde track vaker uitgebracht is, bijvoorbeeld op single, de CD en nog een keer op de 'best of' CD. Maar dan moet track id er dus bij, en moet bij track de album en artiest id's verdwijnen. Je moet dat maar op één niveau afvangen die relatie.

Verder noem je een tabel 'Tracks' en is de rest in enkelvoud.

Je hoeft van mij mijn standaard (enkelvoud voor alles) niet aan te houden, maar doe het allemaal wel volgens de zelfde manier.

[ Voor 73% gewijzigd door BikkelZ op 09-03-2008 16:29 ]

iOS developer


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-10 14:28
Wat doe je wanneer een track op meerdere albums voorkomt? Zoals bij best of ... albums nog wel eens voorkomt.

Wat doe je met mix albums, bijvoorbeeld een album met de 20 beste liedjes uit de jaren 60? Zoals je het nu hebt ingedeeld kun je niet meer aangeven welke artiest welk liedje heeft gedaan.

  • BikkelZ
  • Registratie: Januari 2000
  • Laatst online: 21-02 08:50

BikkelZ

CMD+Z

_js_ schreef op zondag 09 maart 2008 @ 17:27:
Wat doe je wanneer een track op meerdere albums voorkomt? Zoals bij best of ... albums nog wel eens voorkomt.

Wat doe je met mix albums, bijvoorbeeld een album met de 20 beste liedjes uit de jaren 60? Zoals je het nu hebt ingedeeld kun je niet meer aangeven welke artiest welk liedje heeft gedaan.
Je kunt in dat geval het beste doornormaliseren met een extra tabel Uitvoering waarin dat beschreven wordt.

iOS developer


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

_js_ schreef op zondag 09 maart 2008 @ 17:27:
Wat doe je wanneer een track op meerdere albums voorkomt?
In de veronderstelling dat de oorspronkelijk vraag beantwoord is met de conclusie: gebruik NULL, ga ik enigszins offtopic:
offtopic:
Volgens mij is dat zeldzaam. Meestal is het weer net een andere opname. Je maakt het jezelf onnodig moeilijk als je toch nooit wilt weten op welke albums exact dezelfde versie van een liedje staat. Dus: tracks horen bij 1 album en albums bij 1 of meerdere artiesten. Als je verschillende tracks bij elkaar wilt laten horen, dan heb je een tabel met kanonieke 'songs' nodig en een koppeltabel die elke song aan tracks koppelt. Als je de situatie van een cover nog apart wilt opvangen, zal de tabel geen kanonieke songs, maar kanonieke 'artist-song' combinaties bevatten en is er, als je dat wilt, nog een losse tabel met songs nodig om alle verschillende uitvoeringen van verschillende artiesten van hetzelfde nummer ook bij elkaar te kunnen vinden.

[ Voor 6% gewijzigd door Confusion op 11-03-2008 12:46 ]

Wie trösten wir uns, die Mörder aller Mörder?


Verwijderd

offtopic:
Een track als Smoke on the Water of Child in Time komt toch echt voor op zo'n 1035 albums, give or take a few. Je kunt de tracks toch eenvoudig albumonafhankelijk maken of snap ik niet wat jij begrijpt?

  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 25-10 14:28
Confusion schreef op dinsdag 11 maart 2008 @ 12:45:
[...]

In de veronderstelling dat de oorspronkelijk vraag beantwoord is met de conclusie: gebruik NULL, ga ik enigszins offtopic:
offtopic:
Volgens mij is dat zeldzaam. Meestal is het weer net een andere opname. Je maakt het jezelf onnodig moeilijk als je toch nooit wilt weten op welke albums exact dezelfde versie van een liedje staat. Dus: tracks horen bij 1 album en albums bij 1 of meerdere artiesten. Als je verschillende tracks bij elkaar wilt laten horen, dan heb je een tabel met kanonieke 'songs' nodig en een koppeltabel die elke song aan tracks koppelt. Als je de situatie van een cover nog apart wilt opvangen, zal de tabel geen kanonieke songs, maar kanonieke 'artist-song' combinaties bevatten en is er, als je dat wilt, nog een losse tabel met songs nodig om alle verschillende uitvoeringen van verschillende artiesten van hetzelfde nummer ook bij elkaar te kunnen vinden.
Ik denk dat ik het anders bedoel.

Volgens mij hoort een liedje bij een artiest, niet het album.
Album heeft vaak wel alleen liedjes van 1 artiest, maar er zijn ook genoeg verzamelalbums met liedjes van verschillende artiesten.
Mijn idee is dus
Artiest (id,artiestnaam)
Liedje (id,artiest,liedjenaam)
Album (id,albumnaam)
AlbumLiedjes (album,liedje,tracknummer)

  • Kalentum
  • Registratie: Juni 2004
  • Laatst online: 18:42
_js_ schreef op dinsdag 11 maart 2008 @ 14:40:
[...]

Ik denk dat ik het anders bedoel.

Volgens mij hoort een liedje bij een artiest, niet het album.
Album heeft vaak wel alleen liedjes van 1 artiest, maar er zijn ook genoeg verzamelalbums met liedjes van verschillende artiesten.
Mijn idee is dus
Artiest (id,artiestnaam)
Liedje (id,artiest,liedjenaam)
Album (id,albumnaam)
AlbumLiedjes (album,liedje,tracknummer)
Ik zou doen:
Liedje (id, titel, ...)
Album (id, titel, ...)
Artiest (id, naam, ...)
AlbumLiedje (liedje_id, album_id, ... (tracknummer ofzo))
ArtiestLiedje (liedje_id, album_id)

Een liedje hoeft geen album te hebben. Een liedje kan meerdere artiesten hebben. En je hebt geen null waarden. Liedjes zonder album vis je er met een left join wel uit.
Pagina: 1