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

ERD - database ontwerp

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo tweakers,

ik ben al een aantal weken bezig met het opzetten van een databse, maar ik loop tegen een aantal problemen aan. Wellicht kan ik deze oplossen met jullie hulp.

Ik heb de volgende tabellen:

KLANTEN
klantnummer
klantnaam

KLANTARTIKELEN
klantartikelnummer
klantnummer
profielnummer
profielsoortnummer

lengte

PROFIELEN
profielnummer

PROFIELSOORTEN
profielsoortnummer

KNIPORDER
EIS-ordernummer
kistnummer
coilnummer
machinenummer
klantartikelnummer
aantal profielen
zinklaag: JA/NEE

Tot zover is het duidelijk lijkt me. De tabellen klanten, profielen en profielsoorten vormen samen een klantenartikel.

1 kniporder bestaat uit 1 klantenartikel.

Nu komt het probleem. Ik wil controles uitvoeren op de kniporder die afhankelijk is van het artikelnummer. Eenvoudiger gezegd:

controle 1: lengte | breedte | dikte
controle 2: ruwheid | kromheid
controle 3: een andere waarde

afhankelijk van het klantartikelnummer moet er dus een controle plaatsvinden. Een klantartikel kan dus uit controle 1 bestaan, maar het kan ook zo zijn dat zowel controle 1 als controle 2 uitgevoerd moeten worden voor een klantartikel. Hier loop ik dus vast. Ik weet dus niet hoe ik die controles moet verdelen over welke tabellen.

Ik heb geprobeerd om een tabel controles aan te maken met de attributen controlenummer, controlenaam, dus dan zou je het volgende hebben:

controlenummer 1 = controle 1
controlenummer 2 = controle 2
controlenummer 3 = controle 3

maar de vraag is dan waar ga ik die attributen die bij de verschillende controles horen neerzetten. Dus lengte, breedte, dikte enz. Als artikelnummer 1 gekozen is in de kniporder, moet bijvoorbeeld controle 1 én controle 2 worden uitgevoerd. lengte | breedte | dikte & ruwheid | kormheid moeten dus gemeten worden. Maar ik weet dus niet hoe ik deze constructie kan realiseren.

Ik hoop dat iemand me op weg kan helpen.

Verwijderd

Topicstarter
Ik heb nog een tijd lopen vogelen met het probleem. Zou het een optie zijn om een tabel CONTROLES te maken met alle attributen zoals lengte, breedte, ruwheid e.d. op te nemen. Vervolgens een tabel KLANTARTIKELCONTROLES zodat je de attributen opneemt uit de tabel CONTROLES die betrekking hebben op dat klantartikel? Maar in dit geval zal de tabel KLANTARTIKELCONTROLES de waarden uit de tabel CONTROLES overnemen en niet de attributen zelf denk ik.

Zijn er mensen die mij opweg kunnen helpen?

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Verwijderd

Topicstarter
Is er niemand die een mening kan vormen over deze situatie. Waar ik ook aan zit te denken is alle attributen van de controle in een tabel CONTROLES te plaatsen, maar is het dan mogelijk om per klantartikel de formulier met waarden uit de tabel CONTROLES op te bouwen.

  • muksie
  • Registratie: Mei 2005
  • Laatst online: 26-10 22:24
Wat is een controle precies? Is het niet zo dat de controles meer bij de logic horen dan bij de data? Als dat zo is lijkt het me wel net zo logisch om in je programma een aantal van deze controles te implementeren en op één of andere manier een m:n relatie tussen de artikelen en controles maken. Hoe dit te doen is afhankelijk van de mogelijkheden van de taal die je gebruikt, maar je zou misschien een factory klasse kunnen gebruiken die bij een controle id een controle object oplevert o.i.d. welke je vervolgens kunt gebruiken om de controle uit te voeren. Nu ik je post nog eens over lees bedenk ik dat jij volgens mij ook al zoiets hebt :X

Je probleem lijkt vervolgens te liggen bij het opslaan van de attributen van de controles per artikel. Ik zie eigenlijk twee oplossingen:
1. Alle controles die attributen per artikel hebben geef je een aparte tabel in de database die een artikel aan deze attributen koppelt. Dit vereist dan wel dat je dit per controle opnieuw implementeert.
2. Je maakt een CONTROLEATTRIBUTEN tabel die aan iedere controle een aantal attributen koppelt, een KLANTARTIKELCONTROLES tabel die aan ieder artikel een aantal controles toekent, en een KLANTARTIKELCONTROLEATTRIBUTEN tabel die voor iedere (klantartikel, controle, attribuut) combinatie een waarde bevat.

De eerste manier is misschien netter omdat je dan ieder attribuut het best passende datatype kunt geven. De tweede oplossing is flexibeler omdat je dan niet voor iedere (nieuwe) controle de databasestructuur hoeft aan te passen, maar vereist wel dat alle attribuutwaardes als hetzelfde datatype opgeslagen kunnen worden, tenzij je dbms iets van mixed types ondersteund (SQLite doet dat volgens mij). Je kunt natuurlijk wel alles in strings opslaan, maar dat moet je dan waarschijnlijk heel vaak weer omzetten naar integers / floats etc. om ermee te kunnen werken. Maar dit hangt natuurlijk ook sterk van je programma af en van wat je programma moet doen.

Met de nodige joins zal het vervolgens wel mogelijk zijn om een klantartikel op te halen met bijbehorende controles, de attributen die bij die controles horen en ten slotte de waardes van deze attributen.

  • Nick The Heazk
  • Registratie: Maart 2004
  • Laatst online: 07-09-2024

Nick The Heazk

Zie jij er wat in?

Is er een reden waarom je deze controles niet zou afvangen met een programmeertaal? Dat zal immers vele malen makkelijker gaan dan het proberen in je databank te dumpen.

Als je het perse in je databank wilt dumpen zou je het als volgt kunnen proberen. Je voorziet een tabel Controle en ControleAttribuut. Elk ControleAttribuut heeft dan een identificatienummer en een range (ik ga er vanuit dat de controles bestaan uit het testen of een waarde binnen een bepaalde range zitten?). Tenslotte heb je nog een relatie-tabel ControleRelatie oid. Hierin leg je de verbinding tussen een bepaalde Controle en verschillende ControleAttributen.

Op deze manier kun je, mijn inziens, arbitraire range testen in je databank specificeren. Het enige wat nog rest is het leggen van een relatie tussen Controle en KnipOrder/Klant. Je moet maar uitvogelen waar je dat plaatst. Om de controles ook echt te laten uitvoeren door je databank zul je moeten gebruik maken van triggers en stored procedures. Het zou kunnen dat je deze stored procedures in een programmeertaal (C/C++) moet specificeren, omdat SQL mogelijk niet krachtig genoeg is om de controles uit te voeren; dat kan ik je zo niet zeggen.

Performance is a residue of good design.


Verwijderd

Topicstarter
Nick The Heazk schreef op dinsdag 04 maart 2008 @ 21:55:
Is er een reden waarom je deze controles niet zou afvangen met een programmeertaal? Dat zal immers vele malen makkelijker gaan dan het proberen in je databank te dumpen.

Als je het perse in je databank wilt dumpen zou je het als volgt kunnen proberen. Je voorziet een tabel Controle en ControleAttribuut. Elk ControleAttribuut heeft dan een identificatienummer en een range (ik ga er vanuit dat de controles bestaan uit het testen of een waarde binnen een bepaalde range zitten?). Tenslotte heb je nog een relatie-tabel ControleRelatie oid. Hierin leg je de verbinding tussen een bepaalde Controle en verschillende ControleAttributen.

Op deze manier kun je, mijn inziens, arbitraire range testen in je databank specificeren. Het enige wat nog rest is het leggen van een relatie tussen Controle en KnipOrder/Klant. Je moet maar uitvogelen waar je dat plaatst. Om de controles ook echt te laten uitvoeren door je databank zul je moeten gebruik maken van triggers en stored procedures. Het zou kunnen dat je deze stored procedures in een programmeertaal (C/C++) moet specificeren, omdat SQL mogelijk niet krachtig genoeg is om de controles uit te voeren; dat kan ik je zo niet zeggen.
Ik weet niet of het duidelijk is wat ik precies bedoel, maar ik zal het beter proberen uit te leggen.

Het eerste stukje lijkt me duidelijk: dat er een tabel klanten, profielen en profielsoorten zijn. De sleutels van deze 3 tabellen vormen een klantartikel. Dus de tabel klantartikel bestaat uit klantartikelnummer, klantnummer, profielnummer, profielsoortnumer.

Nu is het zo dat deze klantartikelen tijdens de productie op een aantal punten gecontroleerd moeten worden en deze waarden moeten vastgelegd worden in een database.

Voorbeeld:
klantartikel 1 moet gecontroleerd worden op lengte(max 20cm), breedte(max 10cm), ruwheid.
klantartikel 2 moet gecontroleerd worden op lengte(max 10cm), breedte(max 5 cm), ruwheid.
klantartikel 3 moet gecontroleerd worden op hoogte(max 2 cm), vlakheid
klantartikel 4 moet gecontroleerd worden op lengte(max 35cm), ruwheid, vlakheid.

elke klantartikel heeft dus eigen waarden en attributen die ingevoerd moeten worden. Dus voor elk klantartikel zou een aparte formulier opgebouwd moeten worden die alleen de attributen toont die gelden voor dat klantartikel en de invoer moet gecontroleerd worden aan de hand van de waarden die gelden voor dat klantartikel.

Ik hoop dat het zo ietst duidelijker wordt.

Verwijderd

Topicstarter
Hallo mensen,

na een hoop gerotzooi heb ik het volgende gedaan i.v.m. de lastige constructie. Ik ben namelijk met ms access bezig en dit heeft zijn beperkingen vergeleken met programmeertalen dat weet ik.

Tabellen/Attributen:
Klanten: klantnummer, klantnaam
Profielen: profielnummer
Profielsoorten: profielsoortnummer

KlantArtikelen: klantartikelnummer, klantnummer, profielnummer, profielsoortnummer, lengte

Opmerking: De tabel KlantArtikelen wordt dus samengesteld door de tabellen (Klanten, Profielen, Profielsoorten). Deze 3 tabellen vormen een KlantArtikel.

Vervolgens:
Tabellen/Attributen:
KnipOrders: ordernummer, kistnummer, coilnummer, machinenummer, klantartikelnummer, aantal profielen, datum, commentaar, status.

Nu komt het:
Vorige keer zat ik in de problemen omdat ik controles wilde koppelen aan de kniporder, maar het probleem was dat een controle niet perse voor een kniporder uitgevoerd dient te worden. Nu heb ik het op de volgende manier aangepakt:
Ik heb voor elke controle een aparte tabel aangemaakt:

Tabellen/Atributen:
Controle1: controle1nummer, ordernummer, attribuut1, attribuut2, attribuut3
Controle2: controle2nummer, ordernummer, attribuut4, attribuut5, attribuut6
Controle3: controle3nummer, ordernummer, attribuut7, attribuut8, attribuut9

Ik heb de attributen voor het gemak niet bij naam genoemd. Zoals jullie zien heb ik ordernummer als attribuut aan elke controle toegevoegd. Dit heb ik gedaan omdat niet elke controle voor een bepaalde kniporder uitgevoerd dient te worden en als je controle1nummer, controle2nummer, controle3nummer als attribuut aan de tabel Kniporder toevoegd zeg je dus dat alle controles voor iedere kniporder uitgevoerd moeten worden, dat is dus niet de bedoeling.

Nu zit ik met de volgende vraag:

Bij attribuut1 wil ik een soort van "validationrule" opgeven. Dus als ik een formulier heb gemaakt van Controle1 en ik vul een waarde in bij attribuut1 dan moet ie de volgende controle doen:

bv. hij moet eerst naar de lengte kijken van het profiel dat geselecteerd is. Dus als bij KnipOrder het klantartikelnummer 1 geselecteerd is moet ie in de tabel KlantArtikelen bij de lengte kijken.
Stel dat de lengte 10mm is. Dan mag de waarde die ingevuld wordt max: lengte+ (lengte:1000) en min: lengte -(lengte:1000) zijn.

De vraag is hoe ik dit kan realiseren. Ik heb heel lang lopen vogelen met de controles voordat het lukte. Volgens mij denk ik nu gewoon veel te moeilijk en zal het wel iets simpels zijn, maar ik kom er gewoon niet op. Graag jullie hulp.

  • MicroWhale
  • Registratie: Februari 2000
  • Laatst online: 18-11 10:45

MicroWhale

The problem is choice

waarom maak je geen tabel met daarin:

artikelnummer,
eigenschap, (lengte, breedte, hoogte, ruwheid, viscositeit, etc...)
vergelijking, (=, <, >, <=, >=, !=)
waarde.

Zo kun je per artikelnummer een oneindig aantal eigenschappen vergelijken op een bepaalde waarde.

Bij het invoeren van een kniporder, haal je voor het artikelnummer de toetsen op en kijkt of deze allemaal TRUE zijn. Zo niet, fout. Zo wel, :).

Het enige belangrijke is dat je vandaag altijd rijker bent dan gisteren. Als dat niet in centen is, dan wel in ervaring.


Verwijderd

Topicstarter
MrWilliams schreef op dinsdag 18 maart 2008 @ 12:34:
waarom maak je geen tabel met daarin:

artikelnummer,
eigenschap, (lengte, breedte, hoogte, ruwheid, viscositeit, etc...)
vergelijking, (=, <, >, <=, >=, !=)
waarde.

Zo kun je per artikelnummer een oneindig aantal eigenschappen vergelijken op een bepaalde waarde.

Bij het invoeren van een kniporder, haal je voor het artikelnummer de toetsen op en kijkt of deze allemaal TRUE zijn. Zo niet, fout. Zo wel, :).
Nou simpel eigenlijk: niet elke artikelnummer heeft een bepaalde eigenschap. Daarom wil ik graag dat ik voor een bepaalde attribuut in een controletabel een formule op kan geven. Daarvoor moet ie dus afhankelijk van het klantartikel dat bij kniporder geselecteerd is kijken in de tabel KlantArtikel om de lengte op te halen. Vervolgens is het zo dat max: lengte+ (lengte:1000) en min: lengte -(lengte:1000) is. Mijn vraag is dus hoe ik dit als validationrule kan aanmaken.
Pagina: 1