Database indeling advies nodig

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Back-End Developer PHP

Back-End Developer PHP7 (Laravel) We search for our client with an energetic, young and fast growing team a new pearl in Back End Dev to join their team in the centre of Amsterdam! The company is based on the newest technology, is funded by top-tier investors, delivers on an ambitious roadmap, and is supported by a talented team. We search for a full-time Back-End Developer to join our team in Amsterdam. We are looking for a pro-active, software developer with experience building large scale SaaS applications. You'll work autonomously, will ship multiple features a week, help determine the roadmap and

Bekijk vacature »

Manager Softwareontwikkeling en ICT Infrastructuur

Manager Softwareontwikkeling en ICT- Infrastructuur 0,8 – 1,0 fte Standplaats: Arnhem Ben je op zoek naar een werkgever waar je jouw creativiteit op het gebied van ICT en innovatie kwijt kan? Krijg je graag de ruimte om creatieve ideeën op het gebied van ICT en innovatie los te laten op onze dienstverlening om zo de beste te zijn en voorop te (blijven) lopen? Inkassier loopt voorop als het gaat om IT-ontwikkeling en innovatie. Maar deze voorsprong willen we nòg groter maken. Hiervoor zijn we op zoek naar een creatieve en ambitieuze manager softwareontwikkeling en ICT-infrastructuur. Iemand die zich onderscheid van

Bekijk vacature »

Tech Lead Application Developers

REMOTE WORK POSSIBLE FOR THIS ROLE* For our Europe development center in Eindhoven we’re looking for an Application Tech Lead that is able to work on enterprise type applications deployed across the world. As a tech lead at UPS you work on enabling the delivery of functionality for highly complex IT Systems. More than 500,000 UPSers move goods, capital and information across the world and deliver over 22 million items to their destinations every day. And our IT Systems make sure this can be done as efficient as possible. What You’ll Do You collaborate with internal customers as well as

Bekijk vacature »

AWS Cloud Architect / Senior Cloud Developer Inter

Scope of the assignment Environment is ready to perform data injections to new platform. Defined standards and best practices to work with cloud technology Setup framework of standard designed patterns to perform data ingestion and data analysis Proving the value of propose solution – running end to end PoCs New way of working rolled up to other DevOps teams – setting up trainings Location T-Mobile's headquarter is in The Hague. The following qualifications are required 8-10 years of experience A solid background in Linux/Unix and Windows server system administration An understanding of writing Infrastructure-as-Code (IaC), using tools like CloudFormation or

Bekijk vacature »

Sr PHP Backend Developer / Laravel

Over de werkgever: Wij zijn een groep tech-minded developers. Is software-development jouw passie? Heb jij ervaring als developer? Vaste baan: Sr PHP Backend Developer Laravel 3.800 - 5.500 Senior Backend Developer Wij werken uitsluitend met teams van in-house professionals. Daarnaast specialiseren wij ons in het uitdenken, ontwikkelen en opleveren van hoge kwaliteit en schaalbare oplossingen voor MKB en enterprise. Zo ontwikkelen we custom tooling en applicaties voor een aantal bedrijven in de top vijftig van Nederland. Wij werken, zoals gezegd, voor MKB klanten. We hebben veel verschillende projecten. Houd jij van afwisseling? Dan zit je bij ons goed! Wij zijn

Bekijk vacature »

Fullstack Developer GUI Linux / UI/UX Design

Bij welk bedrijf je gaat werken: Wij zijn de leider in intelligente signaleringssoftware voor o.a. 2G/3G, 4G/LTE, 5G netwerken. Ben jij een fullstack developer? Heb je ervaring met o.a. HTML en CSS, UI/UX design, JavaScript, Typescript, React, Go en PHP? Vaste baan: Fullstack Developer GUI Linux HTML CSS 3.000 - 4.500 Fullstack Developer Wij ontwikkelen intelligente software voor 4G / 5G, WiFi en andere complexe netwerken. Het gaat om software producten voor routing, security en interworking. Toe aan een mooie, nieuwe uitdaging? Bij ons kom je terecht in een prettige, dynamische werkomgeving, waarbij je samenwerkt met uitstekende vakspecialisten op gebied

Bekijk vacature »

Cloud Developer - Smart Logistics

Bouw jij de professionele applicaties die onze klanten zo hard nodig hebben? En wil je graag met de nieuwste technologieën werken binnen een DevOps scrumteam? Lees dan snel verder! Wat ga je doen? “Use digital to move smarter De unit Smart Logistics binnen de Transport & Logistics sector van CGI ontwerpt, bouwt en onderhoudt veelal missie-kritische applicaties voor onze klanten uit de transport en logistieke sector. Zonder deze sector worden onze pakketjes niet op tijd afgeleverd, rijden de treinen niet meer van a naar b en varen schepen niet veilig de haven binnen. Om deze transport en logistieke ketens te

Bekijk vacature »

Fullstack .Net (Core)/C# Developer zet zich in voo

Voor een organisatie gespecialiseerd in het ontwikkelen van software voor dierenartspraktijken ben ik op zoek naar Fullstack .Net (Core)/ C# Developers. De organisatie, 15 jaar geleden opgericht heeft een internationale klantenkring met meer dan 10.000 praktijken. Er hangt een nuchtere en familiaire sfeer, waar je je snel in thuis zal voelen. In 3 Scrum teams wordt er gewerkt aan her/doorontwikkeling van de dierenartspraktijksoftware en aanverwante tools. Je focus ligt bij het design, programmeren, unit testen en deployen van van nieuwe functionaliteiten. Waarbij je voor 80% bezig bent in de backend en 20% in de frontend. Wat moet je kunnen? -

Bekijk vacature »

MS Dynamics AX Ontwikkelaar

Voor een klant in Nuth zoeken wij een MS Dynamics AX Ontwikkelaar. Je zult het team per direct versterken met innovatieve oplossingen. Wat bieden wij jou Een marktconform salaris Uitdagende positie in een groeiende organisatie Een dynamische werksfeer en ruimte voor inbreng Doorgroeimogelijkheden Wie ben jij Als MS Dynamics AX Ontwikkelaar beschik je over de volgende eigenschappen: Je hebt een minimaal afgeronde Bacheloropleiding richting Informatica/ ICT; Je hebt minimaal twee jaar ervaring als ontwikkelaar van Microsoft Dynamics; Hoge betrokkenheid met collega’s en (interne) klanten; Je bent proactief, en communicatief vaardig; Je bent leergierig en enthousiast! Wat ga je doen Je

Bekijk vacature »

Applicatie Ontwikkelaar Outsystems / MVC

Voor wie je gaat werken: Wij realiseren kabel- en leidingsnetwerken. Ben jij een ervaren applicatie ontwikkelaar? Heb jij ervaring met .NET? Vaste baan: Applicatie Ontwikkelaar Outsystems MVC 3.000 - 4.300 Applicatie Ontwikkelaar Wij werken met professionele vakmensen. Die zich elke dag helemaal inzetten voor de klant. Wij zijn een energieke aannemer die op persoonlijke wijze betrouwbare verbindingen realiseert. Ons werk is het aanleggen van nieuwe of het vervangen van gas- stroom- en (drink)waterleidingen. Hierin zijn veiligheid, betrouwbaarheid, continuïteit en klanttevredenheid van levensbelang Ook werk je aan onze eigen bedrijfsapplicaties. Je ontwikkelt met ons de meest nieuwe software. Wij blinken uit

Bekijk vacature »

Application Developer Tech Lead

REMOTE WORK POSSIBLE FOR THIS ROLE As a Tech Lead Developer at UPS you work on delivering functionality for highly complex IT systems. You collaborate in agile teams and participate in emerging technologies and processes like CI/CD and DevOps to ensure that we meet our objectives effectively and efficiently. Your primary role is to perform full system life cycle activities, e.g. analysis, technical requirements, design, coding, testing and the implementation of software. Working in our Europe development center in Eindhoven means working in an international team with onsite people as well as team members located in other parts of the

Bekijk vacature »

.Net Developer C# / Software

Over het bedrijf: Wij zijn een software ontwikkelaar. Ben jij een Full Stack .Net Developer? Heb je ervaring als .Net Developer Vaste baan: .Net Developer C# Full Stack 3.000 - 4.300 .Net Developer Wij zijn een Nederlandse ontwikkelaar van ERP-software en richten ons op o.a. bouw- en productiebedrijven, die veel te maken hebben met projecten. Wij zijn een veelzijdige organisatie. Je werkt voor onze eigen IT organisatie. We werken met moderne technologie en staan open voor innovatie. Je werkt bij ons in een prettige en informele omgeving. Jouw werkzaamheden als .Net Developer C#: Voor de vacature als .Net Developer Rijssen

Bekijk vacature »

Senior C# Developer

Senior C# Developer (Full Stack) 's-Hertogenbosch Wij zoeken op korte termijn een Senior C# Developer TRG groeit snel en om deze groei te ondersteunen is ons Nederlandse kantoor op zoek naar een Senior C# Developer voor onze vestiging in ’s-Hertogenbosch. Voor de ontwikkeling van onze web-portal specifiek voor aandelenbeurzen hebben wij dringend behoefte aan een collega developer. Ben je een C# webdeveloper met gevoel voor UI en blink je uit in het spotten van verbeteringen? Lijkt het je een fantastische uitdaging om mee te werken aan het opzetten van een nieuw product? Dan zit je bij ons goed. Functieomschrijving Als

Bekijk vacature »

Front End Developer

(Senior) Front-End Developer High-growth startup looking for creative developers to help build the future of B2B Commerce. FULL-TIME · LEIDSEPLEIN, AMSTERDAM In short Innovative online B2B marketplace to bring brands and retailers together transforming wholesale commerce; Using machine learning to match retailers with suppliers; data, recommendations, social interaction, etc; Talented team and extremely ambitious roadmap; For javascript kings with extensive framework (VueJS, React, etc.) experience; Transformed a former restaurant into an office space. Obviously, the bar is still standing and open on Friday's (true story)! About us We are an online B2B marketplace that brings brands and retailers together to

Bekijk vacature »

Midlevel/Sr Developer bij leverancier communicatie

Een van de grootste leveranciers van communicatieplatformen aan bijv. internationale telecompartijen is op zoek naar een nieuwe teammember: een ervaren Midlevel tot Senior .Net Developer. De organisatie werkt met de nieuwste en uitsluitend Microsoft .Net technologieën (.Net Core, Azure) en producten als Docker en Kubernetes. Zij werken in Scrum sprints met teams waar samenwerking en (persoonlijke)groei hoog in het vaandel staat. Ze zijn op zoek naar gepassioneerde .Net Developers, waarbij ervaring met bovengenoemde technologieën geen harde eis maar een pré is. Genoeg ruimte dus om ervaring hierin op te doen. Drie jaar geleden hebben zij naast hun huidige applicatie een

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

04/08/2021 11:26:58
 
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.