Database indeling advies nodig

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Vacature PHP developer / back-end ontwikkelaar

Functieomschrijving Vacature medior PHP developer / ontwikkelaar PHP developer 40 uur per week Shopcommerce B.V. Thuiswerken (deels) Over Shopcommerce BV Wij zijn een groeiend full-service e-commerce bureau welke gespecialiseerd is in de ontwikkeling van premium webwinkels. Hierbij hebben we de focus gelegd op het e-commerce platform Magento 2. Met het team van circa 20 specialisten (ICT & content) verzorgen wij dagelijks voor het up-en-running houden van onze webshops en zorgen we voor een betere vindbaarheid in diverse talen en landen. We combineren onze creatieve talenten met strategische inzichten en technische vaardigheden. Jouw nieuwe functie Je bent voor deze functie als

Bekijk vacature »

BI Ontwikkelaar / Junior of Starter (WO) @ Apeldoo

2021-06-15 iSense BI Ontwikkelaar Junior of Starter (WO) Ben jij WO-opgeleid en een junior of starter op het gebied van ontwikkelen? Lijkt het je leuk om in een jaar opgeleid en begeleid te worden en mee te werken als BI-ontwikkelaar? Lees dan snel verder wat dit inhoudt en solliciteer! ISRO50193 Organisatie Als preffered supplier zijn we voor de Belastingdienst (te Apeldoorn) op zoek naar junior BI ontwikkelaars voor het SAS platform. SAS is een geavanceerd Big Data-softwareplatform dat wordt gebruikt voor toegang, beheer, rapportage en analyse van data in allerlei vormen. Jouw eerste jaar staat in het teken van het

Bekijk vacature »

Senior Node.js Developer (NL) bij PostNL

Senior Node.js Developer (NL) Den Haag HBO/WO IT Professional "Als Senior Node.js Developer impact maken op de groeiende E-commerce markt met onze logistieke software. Je doet dit door complexe bedrijfskritische logistieke business processen te vertalen naar de ontwikkeling en uitbreiding van onze Cloud IT-platformen en software oplossingen in JavaScript en AWS" Wat ga je doen? PostNL is becoming a postal tech company. Als Senior Node.js Developer ben je onderdeel van een multidisciplinair Business-IT-team bestaande uit onder andere een Lead Engineer, JavaScript Developers en Solution Consultants. Samen zijn jullie verantwoordelijk voor het bouwen aan het Event Management Platform (EMP). Dit platform

Bekijk vacature »

Ervaren C# .NET Developer / Javascript

Over het bedrijf: Wij leveren software aan beurzen, banken en pensioenfondsen. Ben jij een ervaren software ontwikkelaar? Heb jij ervaring met C# en Javascript? Vaste baan: Sr C# Developer C# .NET Javascript 3.500 - 5.000 Senior C# Developer Wij zijn een groeiend en innoverend bedrijf dat wereldwijd adviseert over financiële informatie- en analysesystemen die gebruikt worden door bijvoorbeeld banken en pensioenfondsen. Bij ons werk je aan onze eigen bedrijfsapplicaties. Je ontwikkelt met ons de meest nieuwe software. Wij blinken uit als het gaat om de inzet van technologie. Wij staan open voor elke nieuwe trend. Onze systemen zijn groot en

Bekijk vacature »

C# Python Fullstack Developer / Grasshopper

Wie wordt jouw werkgever?: Wij bieden woningen en appartementen aan. Ben jij een ervaren fullstack developer? Heb jij ervaring met Grashopper? Vaste baan: C# Python Fullstack Developer Rhino 2.800 - 4.500 Fullstack Developer We leven het liefst in een huis waarin we ons onbezorgd en thuis voelen en waar genoeg financiële ruimte overblijft om leuke dingen te doen. Wij begrijpen dat. Bovendien gaan wij nog een stap verder: wij geloven dat een huis niet alleen gaat over het vinden van ruimte voor nu, maar ook over het behouden van ruimte voor toekomstige generaties. Ons doel? Een comfortabel leven voor vandaag,

Bekijk vacature »

.NET Developer / Azure @ Utrecht

2021-08-02 iSense .NET Developer / Azure Ben jij een .NET Developer en wil jij jouw ervaring graag inzetten bij een gerenommeerde organisatie die zich focust op het inhouse oppakken en uitvoeren van innovatieve projecten voor diverse organisaties in Nederland? Lijkt het je daarnaast leuk dag in dag uit alles te halen uit Azure, mee te denken over architectuur vraagstukken en van scratch af aan oplossingen te bouwen? Lees dan nu verder! ISHU47628 Organisatie Als .NET developer ga je werken in een DevOps team aan state-of-the-art oplossingen voor diverse opdrachtgevers. Dit doe je voornamelijk in-house op hun kantoor in regio Nieuwegein

Bekijk vacature »

3D Applications Developer

Role: 3D Applications Developer Location: Heerlen, Netherlands Salary: Flexible + Great benefits! Must have a valid Dutch work permit to apply! Want to join an international business that values your career progression and growth?! My client is now looking for a 3D Applications Developer to join their fast-growing team to help with developing new ways to promote their bespoke business solutions in the global market. Your role will be to develop innovative applications to enhance company sales and efficiency, overall contributing to growth. They are a global market leader in development, sustainability, and e-commerce. With offices covering the globe, the

Bekijk vacature »

Drupal Developer / Kritische applicaties @ Utrecht

2021-06-21 iSense Drupal Developer Kritische applicaties Wil jij werken voor een organisatie die werkt met de nieuwste technieken op het gebied van software ontwikkeling, een groot maatschappelijk belang heeft en een zeer diverse omgeving? Lees dan snel verder! ISB42382 Organisatie Je gaat werken bij een groot onderzoeksinstituut in de omgeving Zeist die een rijke historie heeft en al meer dan 100 jaar bestaat. Als Drupal Developer ga jij deelnemen aan een groot aantal websites en zal je software bouwen voor verschillende branches met een groot maatschappelijk belang. Deze organisatie is verantwoordelijk voor allerlei onderzoeken en hebben dan ook een groot

Bekijk vacature »

Junior Mendix Developer - Infrastructure

Bedenk jij voor ieder business vraagstuk de juiste oplossingen en weet jij daarbij perfect gebruik te maken van alle mogelijkheden vanuit het Mendix platform? Wat ga je doen? Als Mendix Developer begeleid en adviseer je onze klanten bij het analyseren van hun aangegeven business problematiek. Hierbij denk je buiten de gevestigde kaders en weet je optimaal gebruik te maken van de mogelijkheden die geboden worden vanuit het Mendix platform. Vaak heb je een pioniersfunctie en vorm je het eerste aanspreekpunt voor de klant. Het oplossen van een business vraagstuk is jouw passie en met behulp van de Mendix technologie ben

Bekijk vacature »

Medior C# Developer

You'll build modern applications for Coolblue back’s office. We have a lot of friends, and they crave well-structured data and user-friendly, task-focused applications. How do I become a Medior C# Developer at Coolblue? You regularly participate in brainstorm sessions about user experience, data, and task flow with the UX Designer, Product Owner, and Data Scientists in your team. Besides that you will create disconnected, highly congruent, and testable code that can easily be maintained and is future-proof. Want to become C# Developer at Coolblue? Read below if the job suits you. You enjoy doing this Working with various types of

Bekijk vacature »

Fullstack Developer / Aurelia / C# @ Ede

2021-08-02 iSense Fullstack Developer Aurelia C# Ben jij een Fullstack Developer met meerdere jaren werkervaring? Heb je gewerkt met een of meerdere JavaScript Frameworks/Libraries in combinatie met C# en wil jij deze ervaring graag inzetten bij een organisatie die bezig is met een nieuw platform met tal van nieuw te ontwikkelen functionaliteiten waar zeer veel data doorheen gaat? Wil jij hen ondersteunen in het verder uitbouwen van deze applicatie en denk je graag na (met je collega's) over toekomstige oplossingen? Lees dan nu verder! ISHU48790 Organisatie Als Fullstack Developer kom je te werken bij een gerenommeerde organisatie in de regio

Bekijk vacature »

Scala Developer @ Den Haag

2021-07-21 iSense Scala Developer Ben jij een ervaren Scala Developer en op zeer korte termijn beschikaar voor een opdracht in Den Haag? Lees dan verder! ISAC50543 Nieuw Organisatie Onze klant is een internationale organisatie waarvan het Nederlandse kantoor is gevestigd in regio Den Haag. De branche waarin ze actief zijn is onderhevig aan grote technologische en digitale ontwikkelingen. Om deze ontwikkelingen ook van binnenuit de organisatie te ondersteunen en te professionaliseren is jouw positie erg belangrijk! Je komt te werken in het team wat verantwoordelijk is voor de search optimalisatie. Hierbij zal je samen gaan werken met onder meer een

Bekijk vacature »

Fullstack .NET DEVELOPER - GRADUATE PROGRAM @ Rand

2021-06-10 iSense Fullstack .NET DEVELOPER - GRADUATE PROGRAM Ben je onlangs afgestudeerd van een IT-opleiding of heb je nog maar weinig ervaring opgedaan? En wil je toch graag aan de slag als .NET Developer? Lees dan snel verder, want op 9 augustus 2021 starten wij weer met een graduate programma waarin jij jezelf kunt ontwikkelen tot een volwaardige Fullstack .NET Developer! ISLE50166 Locatie Randstad/Eindhoven Wat ga je doen tijdens het Fullstack .NET Developer Graduate Programma? In augustus krijg jij via de Experis Academy een unieke kans om jouw IT-carrière een kickstart te geven en jezelf te ontwikkelen tot Fullstack .NET

Bekijk vacature »

Advanced Mendix Developer Logistic Solutions (NL)

Advanced Mendix Developer Logistic Solutions (NL) Den Haag HBO/WO IT Professional "Als Advanced Mendix Developer impact maken op de groeiende E-commerce markt met onze logistieke software en onze kritieke logistieke keten. Je doet dit door ontwikkeling en uitbreiding van onze Mendix Cloud omgeving, waarbij je complexe business processen vertaalt naar kritieke Mendix applicaties." Wat ga je doen? PostNL is becoming a postal tech company. Je komt te werken binnen PostNL Logistic Solutions. Daar gaan we net wat verder dan een standaardpakket of brief. Het gaat bijvoorbeeld om gekoeld vervoer van medicijnen (Health), Warehousing (Fulfilment), het leveren binnen hele strakke tijdvakken

Bekijk vacature »

Salesforce developer

Functieomschrijving Do you want to help shape the global Salesforce environment of the world’s largest HR service provider, defining, building and continuously improving the solution 28.000 people will use on a daily basis? Helping shape the working life of over 500 million talented individuals? As part of building a global Salesforce programme we are looking for multiple experienced Salesforce Developers. You work closely with our Technical lead, product owner and other salesforce developers and consultants to implement and integrate a global package of features based on Sales Cloud, Services Cloud, Marketing Cloud and Bullhorn for Salesforce, including but not limited

Bekijk vacature »
Jan terhuijzen

jan terhuijzen

10/08/2020 15:54:44
Quote Anchor link
Ik heb veel ervaring met PHP en het bedenken van eenvoudige structuren voor de indeling van een database.
Nu ben ik een systeem aan het maken voor een bedrijf dat verlichting installeert.
Elke opdracht, dus eigenlijk installatie, is een apart object in de database.
Bij installaties kan ook onderhoud worden uitgevoerd, zoals lampen vervangen of noem maar iets. En er kunnen algemene notities worden gekoppeld aan installaties. De notities (met hun datum) vormen samen een soort logboek bij de installatie.

Een installatieadres is vaak verschillend dan het klantadres.
Eenzelfde klant kan meerdere installaties aan zich gekoppeld krijgen.

Ik wil de grootte van de totale data in de database zo compact mogelijk houden, maar tegelijkertijd wil ik ook de queries om gegevens te selecteren zo snel en licht mogelijk kunnen maken.

Hieronder de twee database modellen die ik tot nu toe heb bedacht:

Optie 1

https://snipboard.io/eAjwnh.jpg


Optie 2

https://snipboard.io/pCl2fq.jpg

Waar het grotendeels om gaat is hoe ik adresgegevens opsla. Ik beschouw in het eerste model de adressen als een apart object, dat altijd één op één gekoppeld is aan een ander object dat een adres kan hebben, zoals een klant (factuuradres) en een installatie (als installatieadres). Door de adresgegevens als apart object onder te brengen, bespaart dit velden in de Customers tabel en in de Installations tabel.
Zou een Customer adres hetzelfde zijn als het Installation adres, dan hoeft er maar één rij te worden gemaakt in de Adresses tabel.
Zou je naar model 2 kijken, dan zie je dat ik de adresgegevens niet in een aparte tabel zet, maar gewoon als kolommen opsla in de Customers en Installations tabel. Is het klantadres dan hetzelfde als het installatieadres, dan zijn de waardes van die kolommen dus identiek aan elkaar. Dit kost dan tevens dubbel zo veel data opslag voor de adresgegevens.

Bij ongeveer 90% van de opdrachten is het klantadres en installatieadres hetzelfde. Vandaar dat ik allereerst met model 1 kwam, maar het nadeel hiervan is dat er meer tabellen zijn en meer 'koppelingen'. Daardoor zullen JOIN queries groter worden en mogelijk belastender zijn voor het systeem.

Wat denken jullie dat de beste aanpak zal zijn?
Gewijzigd op 10/08/2020 15:55:15 door Jan terhuijzen
 
PHP hulp

PHP hulp

19/09/2021 06:55:12
 
Thomas van den Heuvel

Thomas van den Heuvel

10/08/2020 16:51:03
Quote Anchor link
Quote:
Ik wil de grootte van de totale data in de database zo compact mogelijk houden, maar tegelijkertijd wil ik ook de queries om gegevens te selecteren zo snel en licht mogelijk kunnen maken.

Maar de grootte doet er niet toe wanneer je de informatie efficiënt kunt raadplegen. Daarom denk ik dat een goed ontwerp, of beter gezegd, een ontwerp dat toegespitst is op het snel opvragen van gewenste informatie, (zo niet vele malen) belangrijker is dan het super efficiënt opslaan van gegevens. Ik bedoel diskruimte is nou niet direct een beperkende factor meer tegenwoordig?

Het lijkt mij inderdaad wel verstandig om het gebruik van adressen nader te bestuderen.

Quote:
Zou een Customer adres hetzelfde zijn als het Installation adres, dan hoeft er maar één rij te worden gemaakt in de Adresses tabel.

Dat klinkt in eerste instantie logisch, maar wat nu als de klant verhuist (zeg nooit nooit :p)? Dan heeft de installatie ineens op een ander adres plaatsgevonden? :)

Omdat adressen verschillende typen hebben, lijkt het mij in ieder geval belangrijk om onderscheid te maken tussen deze verschilende typen, je hebt nu al bijvoorbeeld:
- adres van de klant (bedrijf of particulier)
- adres van de installatie
- (standaard) factuuradres
en misschien kun je hier nog van afwijken met een custom factuuradres en/of andere adrestypen.
(NB of dit nu inhoudt dat dit tot uiting zou moeten komen als een expliciete adres-type-kolom is een tweede, en laat ik nu nog even in het midden, zie het vervolg)

Misschien is het een idee om, omdat het hier ook / met name om een soort van "historische" gegevens gaat, gewoon (elke) keer kopieën trekt van het origineel, of dat je in ieder geval ergens een letterlijke kopie, zoals die op dat moment geldig is in de tijd, bijhoudt. Deze adressen staan dan redundant opgeslagen, maar dit zorgt dan niet voor problemen wanneer een adres wijzigt omdat niet alles aan elkaar hangt.

Het adres van de installatie staat vast lijkt mij, dus in dat opzicht is het in zekere zin logisch om het adres op te slaan in de installatie-tabel zelf.

Aan de andere kant, je zou je ook kunnen laten sturen in het gebruik en de raadpleging van de adressen. Wat voor queries wil je op adressen loslaten? En hoe vaak komt dit voor? Als je makkelijk en snel in *alle* adressoorten wilt zoeken is het waarschijnlijk handiger om deze in één tabel onder te brengen, maar als dat minder voorkomt, of als je vaker zoekt in één soort adres (factuur, installatie) dan zou je je query of queries ook zo kunnen opbouwen dat deze specifieke tabellen raadplegen; het maakt dan in principe niet zoveel uit dat de adressen niet allemaal op dezelfde plek staan.

Er is voor verschillende soorten aanpakken iets te zeggen, maar ik zou dit voornamelijk sturen door het gebruik, en dan liefst op een manier die zorgt voor eenvoudige, snelle queries. Diskruimte komt wat mij betreft op de tweede plaats.
Gewijzigd op 10/08/2020 16:59:19 door Thomas van den Heuvel
 
Ad Fundum

Ad Fundum

10/08/2020 23:05:07
Quote Anchor link
Je hebt de contactgegevens van een medewerker niet in eenzelfde tabel als de contactgegevens van een klant, waarom niet? Omdat het verschillende soorten contactgegevens zijn. Datzelfde geldt voor de adresgegevens van de klant en die van de installatie. Het zijn twee soorten gegevens. Een klant kan bijvoorbeeld verhuizen, en er kunnen facturen naar gestuurd worden. Een adres van de installatie is onveranderlijk. De enige overeenkomst is dat ze dezelfde velden hebben, maar dat had niet gehoeven. Want wat moet een installatie met een postcode? Je kunt er moeilijk brieven naar sturen.

Voor dit probleem heeft een database UDT's (User-Defined Types). Het idee is een beetje als stdClass, je kunt zelf eigenschappen bepalen, en dan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
INSERT INTO "tabel" ("mijntype") VALUES (('eigenschap1', 'eigenschap2', ..));
SELECT ("mijntype").eigenschap1, ("mijntype").eigenschap2, .. FROM "tabel"


Dan kom je op iets als onderstaande:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
CREATE SEQUENCE "geslacht_id_seq";
CREATE TABLE "geslacht" (
  "id" bigint NOT NULL DEFAULT nextval('geslacht_id_seq'::regclass),
  "naam" text NOT NULL,
  "aanhef" text NOT NULL,
  PRIMARY KEY ("id")
) WITH (OIDS=FALSE);
COMMENT ON TABLE "geslacht" IS 'Geslacht';
COMMENT ON COLUMN "geslacht"."id" IS 'ID';
COMMENT ON COLUMN "geslacht"."naam" IS 'Naam';
COMMENT ON COLUMN "geslacht"."aanhef" IS 'Aanhef';
INSERT INTO "geslacht" ("naam", "aanhef") VALUES ('Man', 'Dhr.'), ('Vrouw', 'Mw.');

-- adres als UDT
CREATE TYPE "adres" AS (
  "straat" text,
  "huisnummer" text, -- ivm. toevoegingen
  "postcode" text,
  "plaats" text,
  "land" text
);
COMMENT ON TYPE "adres" IS 'Adres';

-- particuliere klant
CREATE SEQUENCE "klant_id_seq";
CREATE TABLE "klant" (
  "id" bigint NOT NULL DEFAULT nextval('klant_id_seq'::regclass),
  "aangemaakt" timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMPTZ,
  "geslacht_fk" bigint NOT NULL,
  "van" date NULL DEFAULT NULL,
  "tot" date NULL DEFAULT NULL,
  "achternaam" text NOT NULL,
  "tussenvoegsel" text NOT NULL,
  "voornamen" text NOT NULL,
  "notitie" text NOT NULL DEFAULT E'',
  "adres" adres NOT NULL,
  PRIMARY KEY ("id"),
  CONSTRAINT "klant_geslacht_fkey" FOREIGN KEY ("geslacht_fk")
    REFERENCES "geslacht" ("id") MATCH SIMPLE ON UPDATE CASCADE ON DELETE RESTRICT
) WITH (OIDS=FALSE);
COMMENT ON TABLE "klant" IS 'Particuliere klant';
COMMENT ON COLUMN "klant"."id" IS 'Klantnummer';  -- geen dubbele PK klantnr / id
COMMENT ON COLUMN "klant"."aangemaakt" IS 'Aangemaakt';
COMMENT ON COLUMN "klant"."geslacht" IS 'Geslacht';
COMMENT ON COLUMN "klant"."van" IS 'Geboortedatum';
COMMENT ON COLUMN "klant"."tot" IS 'Overleden';
COMMENT ON COLUMN "klant"."achternaam" IS 'Achternaam';
COMMENT ON COLUMN "klant"."tussenvoegsel" IS 'Tussenvoegsel';
COMMENT ON COLUMN "klant"."voornamen" IS 'Voornamen';
COMMENT ON COLUMN "klant"."adres" IS 'Adres';
COMMENT ON COLUMN "klant"."notitie" IS 'Notitie';

-- installatie
CREATE SEQUENCE "installatie_id_seq";
CREATE TABLE "installatie" (
  "id" bigint NOT NULL DEFAULT nextval('installatie_id_seq'::regclass),
  "klant_fk" bigint NOT NULL,
  "aangemaakt" timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP,
  "voltooid" timestamptz NULL DEFAULT NULL,
  "notitie" text,
  "adres" adres NOT NULL DEFAULT E'',
  PRIMARY KEY ("id"),
  CONSTRAINT "installatie_klant_fkey" FOREIGN KEY ("klant_fk")
    REFERENCES "klant" ("id") MATCH SIMPLE ON UPDATE CASCADE ON DELETE RESTRICT
) WITH (OIDS=FALSE);

Je kunt dit voorbeeld doorzetten voor werknemers.

Mocht je met MySQL werken dan kan je veel dingen niet helaas, zoals gebruik maken van UDT's, datums opslaan met tijzone, en foreign keys gebruiken op engines anders dan InnoDB. Omdat je toch een applicatie nieuw ontwikkelt is gebruik van PostgreSQL de betere en minder tijdrovende optie.
Gewijzigd op 10/08/2020 23:06:34 door Ad Fundum
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.