[Database] Feedback op ontwerp

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
Hé tweakers,

In het verleden hebben we een applicatie met een achterliggende database geschreven. Momenteel gaan we beginnen aan een revisie van deze applicatie en uitbreiding van de database is hier ook een onderdeel van. Ik twijfel echter soms of het ontwerp wel helemaal goed is, dus ik zou het op prijs stellen als er eens wat meer mensen hun mening over zouden willen geven.

Het gaat om een MySQL database, met behulp van een export via PHPMyAdmin en een import in MySQL Workbench, is daar het volgende EER diagram uitgekomen (klik voor een grotere afbeelding):

Afbeeldingslocatie: http://www.gaggia.org/img/pc2000_thumb.png

Met enkel een plaatje en geen uitleg, kan er natuurlijk moeilijk feedback gegeven worden, dus hier volgt de uitleg van de applicatie.

Het bedrijf waar ik werk maakt vacuümverpakking machines, ze hebben een aantal verschillende series en daarbinnen een aantal diversen modellen ('types' in het ontwerp). Binnen elk model heb je diversen opties voor diversen onderdelen van de machine. Het is echter niet zo dat bij elk model de opties hetzelfde zijn. De verschillen in onderdelen en opties zijn er in grote lijnen per serie, maar vaak ook nog specifiek per model. De keuze is gemaakt om deze dan ook op basis van model vast te leggen. Afhankelijk van gekozen antwoorden, rollen er diversen artikelnummers uit de database die samen een machine vormen. Soms is een onderdeel afhankelijk van één gekozen optie, terwijl deze ook afhankelijk kan zijn van meerdere gekozen opties.

Al die combinaties zijn onmogelijk te onthouden voor de mensen van verkoop. Het gaat dan om enkele duizenden combinaties die mogelijk zijn. Vandaar is er een productconfigurator geschreven, dit is een klein stukje software binnen het ERP pakket, waarmee aan de hand van vragen en antwoorden de juiste artikelen samengevoegd worden.

Hoe is de opbouw van de database nu verder?
  • We hebben series en types (de modellen), deze zijn met elkaar verbonden. (linksboven in de afbeeldingen)
  • We hebben vragen en antwoord teksten, deze geven de keuzes voor de onderdelen die in een machine kunnen zitten. Deze liggen, per type, gekoppeld in antwoorden en de volgorde van de vragen en de antwoorden kan bepaald worden. (rechtsboven in de afbeelding)
  • We hebben productgroepen en producten, dit spreekt voor zich. Het veld artikelnummer in producten bevat het werkelijke artikelnummer uit het ERP pakket. (rechtsonder in de afbeelding)
  • Alle andere tabellen in de afbeelding, met uitzondering van die aan de rechterkant, zijn koppelingen tussen vragen, antwoorden, types en producten.
    1. Sommige onderdelen zitten altijd in een type, tabel basisonderdelen.
    2. Sommige onderdelen zijn afhankelijk van een enkele vraag, tabel simpel (enkelvoudig zou een betere naam zijn)
    3. De overige onderdelen zijn afhankelijk van een combinatie van vragen, antwoorden en type. De tabellen sealtrafo's, sealbalken en componentplaten. Een aantal van de tabellen aan de rechterkant zijn ook van dit type, maar zijn nog niet geïmplementeerd
  • Verder hebben we nog wat lossen tabellen, die niet rechtstreeks invloed hebben op de onderdelen die eruit rollen, maar meer administratief zijn zoals users en logs.
Irritatie
Hetgeen mij enorm stoort is dat wanneer een onderdeel van verschillende opties afhankelijk is, er eigenlijk altijd een nieuwe tabel nodig is. Vaak komen de opties waarvan de onderdelen afhankelijk zijn wel overeen, maar bij het ene onderdeel heeft een bepaalde optie wel invloed en bij een andere niet.

Voorbeeld:
Sealbalken en sealtrafo's zijn nagenoeg gelijk, maar bij de sealtrafo's is de pomp keuze wel van invloed en bij de sealbalken niet. Daarnaast is er nog wat extra informatie gewenst bij sealtrafo's buiten het aantal, die voor de sealbalken niet nodig is.

In de toekomst gaan we meer van dit soort onderdelen uitwerken en ik zit me dus af te vragen of hier een betere oplossing voor te bedenken is dan hoe het nu gaat. Ook omdat bij een nieuw onderdeel met diversen combinaties er handmatig een tabel bijgemaakt moet worden, nieuwe pagina's geschreven moeten worden, zodat men de koppeling tussen type, gekozen antwoorden en onderdelen kan leggen.

Gewenste feedback
Voor mijn gevoel zit hij van de ene kant dus wel goed in elkaar, maar van de andere ook weer niet. Kunnen jullie er eens naar kijken en dan een antwoord proberen te geven op de onderstaande vragen?

- Hebben jullie een betere oplossing voor het hierboven beschreven probleem?
- Zie je nog op andere plekken in het diagram punten voor verbetering? (Alle tips zijn welkom!)

Acties:
  • 0 Henk 'm!

  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
Even een kleine kick. Het topic staat er al twee dagen op, maar nog geen reactie gehad.
Is er echt niemand die zinnige feedback kan / wil geven?

Acties:
  • 0 Henk 'm!

  • Noork
  • Registratie: Juni 2001
  • Niet online
Je zou ook een tabel met productgroepen en een tabel met attributen kunnen maken. Producten dus koppelen middels een productgroep tabel aan de attributen. Eventueel het mogelijk maken om per product nieuwe attributen toe te voegen.

Zie b.v. [Database Ontwerp]
Ik vermoed dat er nog veel meer topics te vinden zijn, aangezien dit ook vrij veel voorkomt bij webshops van b.v. hardware.

Dat je weinig reacties krijgt kan ook zijn door de zomertijd, complexiteit van je vraag etc.

[edit]Ik zit even in je post history te kijken, en het valt me op dat de meeste topics van jezelf zijn. Dit is vaak niet echt een stimulans voor tweakers om je te helpen. Got is ook weer geen helpdesk ;)

[ Voor 16% gewijzigd door Noork op 15-08-2008 15:37 ]


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik vraag me af wat de legenda is van het plaatje; wat betekend bijv. een stippellijn? Op welke velden zijn de tabellen nu precies gekoppeld? Waarin verschillen rode en blauwe diamantjes? Wat gebeurd er waar die lijntjes overlappen? Even googelen op Mysql Workbench laat ook wat duidelijkere plaatjes zien met een andere style.

Verder vraag ik me af wat het fundamentele verschil is tussen basisonderdelen, 'enkelvoudige' onderdelen en bijvoorbeeld sealbalken. Ik zou zeggen dat er voor een product gekozen wordt als bepaalde vragen zijn gesteld die een bepaald antwoord hebben opgeleverd. Voor basisonderdelen hoeft er aan 1 type en 0 vraag/antwoord-combinaties te worden voldaan, voor 'enkelvoudige' onderdelen aan 1 vraag/antwoord-combinatie en voor sealbalken aan 2 vraag/antwoord combinaties als ik het goed snap. Steeds nieuwe, aparte tabellen lijken me dus wat overdreven en weinig flexibel.

Verder valt mij order_vraag op, waarschijnlijk gaat het hier om het Engelse order?

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Johnny
  • Registratie: December 2001
  • Laatst online: 21-09 14:39

Johnny

ondergewaardeerde internetguru

De combinatie van Engels en Nederlands door elkaar is inderdaad behoorlijk verwarrend, doe het gewoon allemaal in het Engels.

Even afgezien van de structuur zie ik ook diverse datatypen die niet echt optimaal zijn zoals een VARCHAR(20) voor IP-adressen en VARCHAR(10) voor een jaar. En waarom gebruik je VARCHAR(254) in plaats van VARCHAR(255)?

De tabellen sealtrafos, sealbalken, componentplaat en basisonderdelen zouden volgens mij allemaal in dezelfde tabel kunnen genaamd "parts" met wat extra kolommen die NULL kunnen zijn wanneer bepaalde eigenschappen niet op een onderdeel van toepassing is.

Waarom is de tabel antwoord_text los van antwoorden? Een antwoord kan worden gebruikt voor meerdere vragen, maar de tabel simpel koppelt die al.

Verder zou je aan productrgroepen nog een parent_id kolom kunnen toevoegen om zo subgroepen te kunnen ondersteunen. Ook is het in de praktijk vaak handig om wat datums in de tabellen bij te houden, niet alleen om te zien wanneer bepaalde informatie is gewijzigd maar ook bijvoorbeeld voor productiedatums van series en van en tot wanneer onderdelen producten beschikbaar zijn.

Ook lijkt het er op dat je van plan bent om wachtwoorden als plain text in de database op te slaan, iets wat meestal niet zo'n goed idee is.

Aan de inhoud van de bovenstaande tekst kunnen geen rechten worden ontleend, tenzij dit expliciet in dit bericht is verwoord.


  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
Een wat late reactie inmiddels, maar ik heb een beetje drukke periode gehad rondom de introducties.

Ik zal eens even de reacties van jullie afgaan.
Noork schreef op vrijdag 15 augustus 2008 @ 14:42:
Je zou ook een tabel met productgroepen en een tabel met attributen kunnen maken. Producten dus koppelen middels een productgroep tabel aan de attributen. Eventueel het mogelijk maken om per product nieuwe attributen toe te voegen.
Ik denk dat je dit bedoeld voor mijn vraag over het opslaan van extra informatie bij een product. Het probleem hiermee is echter dat die extra informatie weer afhankelijk is van een gekozen antwoord. Het is dus op zich wel een attribuut van een product, maar de waarde van dat attribuut is niet enkel afhankelijk van het product zelf.
Noork schreef op vrijdag 15 augustus 2008 @ 14:42:
[edit]Ik zit even in je post history te kijken, en het valt me op dat de meeste topics van jezelf zijn. Dit is vaak niet echt een stimulans voor tweakers om je te helpen. Got is ook weer geen helpdesk ;)
Ik lees met regelmaat topics die ik interessant vind, maar ben verder vaak zo druk of laat dat ik of geen tijd heb om te antwoorden of er al genoeg reply's zijn gegeven. Reply's die voor mijn gevoel zinvoller zijn dan wat ik op zo'n moment nog kan bijdrage.
pedorus schreef op maandag 18 augustus 2008 @ 11:50:
Ik vraag me af wat de legenda is van het plaatje; wat betekend bijv. een stippellijn? Op welke velden zijn de tabellen nu precies gekoppeld? Waarin verschillen rode en blauwe diamantjes? Wat gebeurd er waar die lijntjes overlappen? Even googelen op Mysql Workbench laat ook wat duidelijkere plaatjes zien met een andere style.
Ik zal daar eens naar kijken. Tot dusver heb ik niet meer gedaan dan enkel een export met phpMyAdmin en dan een import in MySQL Workbench.
pedorus schreef op maandag 18 augustus 2008 @ 11:50:
Verder vraag ik me af wat het fundamentele verschil is tussen basisonderdelen, 'enkelvoudige' onderdelen en bijvoorbeeld sealbalken. Ik zou zeggen dat er voor een product gekozen wordt als bepaalde vragen zijn gesteld die een bepaald antwoord hebben opgeleverd. Voor basisonderdelen hoeft er aan 1 type en 0 vraag/antwoord-combinaties te worden voldaan, voor 'enkelvoudige' onderdelen aan 1 vraag/antwoord-combinatie en voor sealbalken aan 2 vraag/antwoord combinaties als ik het goed snap. Steeds nieuwe, aparte tabellen lijken me dus wat overdreven en weinig flexibel.
Je omschrijft het fundamentele verschil tussen de diversen onderdelen eigenlijk zelf al.
Alles is sowieso afhankelijk van het type, maar per onderdeel verschilt het van hoeveel vraag/antwoord-combinaties deze afhankelijk is.
Het ene moment gaat het enkel om het type, het andere moment om het type en één vraag/antwoord-combinatie en het andere moment om het type en meerdere vraag/antwoord-combinaties.

Flexibel is het inderdaad niet nee, dat hebben we gemerkt en daar willen we in het nieuwe ontwerp ook wat aan gaan doen. Tot nu toe ben ik er echter nog niet uit hoe ik dat precies wil gaan doen.
pedorus schreef op maandag 18 augustus 2008 @ 11:50:
Verder valt mij order_vraag op, waarschijnlijk gaat het hier om het Engelse order?
Jup, niet zo netjes om Engels en Nederlands door elkaar te gebruiken.
Johnny schreef op maandag 18 augustus 2008 @ 12:25:
Even afgezien van de structuur zie ik ook diverse datatypen die niet echt optimaal zijn zoals een VARCHAR(20) voor IP-adressen en VARCHAR(10) voor een jaar. En waarom gebruik je VARCHAR(254) in plaats van VARCHAR(255)?
Meeste van de gene die je noemt zijn een keer snel snel aangemaakt ter uitbreiding en toen is er gewoon wat gekozen. Niet echt netjes en zeker iets om in het nieuwe ontwerp te verbeteren.
Johnny schreef op maandag 18 augustus 2008 @ 12:25:
De tabellen sealtrafos, sealbalken, componentplaat en basisonderdelen zouden volgens mij allemaal in dezelfde tabel kunnen genaamd "parts" met wat extra kolommen die NULL kunnen zijn wanneer bepaalde eigenschappen niet op een onderdeel van toepassing is.
Het probleem hiermee is dat een bepaalde combinatie van meerdere vraag/antwoord-combinaties en type, slechts één product mag opleveren. Er is bijvoorbeeld maar één goede componentplaat mogelijk. Als ik deze samen zou zetten met sealtrafo's, die dezelfde kenmerken heeft en éen extra, dan zou op een selectie van de 3 bepaalde onderdelen voor de componentplaat er ook artikelen voor de sealtrafo uit kunnen rollen en dan kan ik niet meer snel controleren of iets ook daadwerkelijk maar 1 resultaat oplevert.

Hier is natuurlijk wel wat aan te doen, bijvoorbeeld door mee te geven, in een aparte kolom, voor welk onderdeel van de machine dat product is. Je zou dan een tabel krijgen met iets als:
- type
- pomp_id
- sealbalk_id
- sealbalktype_id
- x1_id (nog iets)
- x2_id (en nog iets)
- product_id
- aantal
- machine_onderdeel
Johnny schreef op maandag 18 augustus 2008 @ 12:25:
Waarom is de tabel antwoord_text los van antwoorden? Een antwoord kan worden gebruikt voor meerdere vragen, maar de tabel simpel koppelt die al.
Je hebt een standaard aantal vragen en antwoord texten. Echter per type machine verschilt het of een vraag wel of niet van toepassing is en of bepaalde antwoorden wel of niet van toepassing zijn.
Omdat ik geen zin had om elke tekst weer opnieuw in te voeren als antwoord, heb ik gekozen om de teksten van de antwoorden apart vast te leggen en deze te koppelen via antwoorden aan vragen en type.
Johnny schreef op maandag 18 augustus 2008 @ 12:25:
Verder zou je aan productrgroepen nog een parent_id kolom kunnen toevoegen om zo subgroepen te kunnen ondersteunen. Ook is het in de praktijk vaak handig om wat datums in de tabellen bij te houden, niet alleen om te zien wanneer bepaalde informatie is gewijzigd maar ook bijvoorbeeld voor productiedatums van series en van en tot wanneer onderdelen producten beschikbaar zijn.
Dat van die parent_id is een hele goede, dat kan inderdaad erg handig zijn in de toekomst.
De datums hebben geen zin, dergelijk informatie hoort in het ERP-pakket te staan en niet in deze database. Sowieso is hier niet echt sprake van productiedatums voor bepaalde onderdelen. Veel word vanaf begin tot eind in elkaar gezet, dat wat wel al klaar ligt verloopt zo snel dat het bijhouden van de datums geen zin heeft. In de nieuwe opzet gaan we wel een check inbouwen die controleert of een artikel incourant is in het ERP-pakket terwijl deze nog wel gebruikt word in deze database, zo ja dan moet er een melding van komen. Zowel bij inloggen op het beheer systeem als wanneer iemand gebruik maakt van de productconfigurator.
Johnny schreef op maandag 18 augustus 2008 @ 12:25:
Ook lijkt het er op dat je van plan bent om wachtwoorden als plain text in de database op te slaan, iets wat meestal niet zo'n goed idee is.
Nope, die zullen gewoon netjes gehashed worden, voorlopig is dat nog een test en kan het geen kwaad dat ze in plain text erin staan.

  • MicroWhale
  • Registratie: Februari 2000
  • Laatst online: 20-09 12:00

MicroWhale

The problem is choice

ik zou voor de vraag- en antwoord-texten CLOBs gebruiken. Hier kan een "oneindig" aantal karakters in... Het zou zonde zijn als je antwoord niet helemaal opgeslagen is.

probeer ook het taalgebruik (enkelvoud/meervoud en engels/nederlands) zo eenduidig mogelijk te houden. Bijv. alle tabelnamen en attributen enkelvoud en nederlands.

[ Voor 33% gewijzigd door MicroWhale op 04-09-2008 15:49 ]

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


  • Crazybyte
  • Registratie: Juli 2002
  • Laatst online: 15-09 10:07
MrWilliams schreef op donderdag 04 september 2008 @ 15:47:
ik zou voor de vraag- en antwoord-texten CLOBs gebruiken. Hier kan een "oneindig" aantal karakters in... Het zou zonde zijn als je antwoord niet helemaal opgeslagen is.
Dat lijkt me niet nodig, het gaat niet om lange vragen of antwoorden, ze zullen nooit de volledige lengte van VARCHAR gebruiken. Je moet meer denken aan vragen en antwoorden op de volgende manier
- Pomp -> 16m³ - 230 Volt / 16m³ - 400 Volt / 40m³ - 230 Volt
- Sealtype -> Enkel / Dubbel / Breed
- Sealbalk -> 1x 800mm / 2x 800mm
- Export verpakking -> Ja / Nee
MrWilliams schreef op donderdag 04 september 2008 @ 15:47:
probeer ook het taalgebruik (enkelvoud/meervoud en engels/nederlands) zo eenduidig mogelijk te houden. Bijv. alle tabelnamen en attributen enkelvoud en nederlands.
Zoals ik al aangaf in mijn vorige post ga ik dit in het nieuwe ontwerp beter aanpakken.
Pagina: 1