Ik heb verschillende webapplicaties in Symfony 2 gemaakt en het gezegde 'al doende leert men' is waar in mijn geval. Telkens als ik een nieuwe applicatie maak (of als ik een huidige upgrade) wil ik mezelf weer overtreffen in niveau en zo ben ik nu op het punt gekomen om iets met Table Inheritance (of niet, afhankelijk van het antwoord) te doen.
Versimpelde weergave van tabellen:
Tabel: Company
Velden: ID (PK) company_name
Tabel: Contact
Velden: ID (PK) company_id (FK) first_name last_name
Nu wil ik een notitie-entity toevoegen zodat ik bij de huidige entities (company en contact) notities kan toevoegen. Wie weet komt er in de toekomst een entity bij, dan daarvoor ook een notitie.
De vraag is, hoe te doen.
Velden: ID (PK) company_id (FK) contact_id (FK) contents
Daarbij is één van de twee FK's null uiteraard. Nadeel: bij een nieuw toe te voegen entity moet er ook een nieuwe kolom bij (maar ja, hoe vaak gebeurt dat nu kan je zeggen).
Entity: NotableEntity
Velden: ID
Entity: Company extends NotableEntity
Velden: company_name
Entity: Contact extends NotableEntity
Velden: company_id, first_name, last_name
Op deze manier heb ik unieke ID's voor Company én Contact, zou je zeggen. Alleen is company_id dan een ID in dezelfde tabel. dus ik weet niet of dat wel goed gaat.
De notitie tabel is dan heel simpel:
Tabel: Notities
Velden: ID (PK) notable_entity_id (FK) contents
Vraag:
Wat is slim om te doen? De tabel bevat 3000 companies dus performance-wise hoeft het niet op de milliseconde geoptimaliseerd te worden. Ik vind het wel leuk om iets op de professionele manier aan te pakken alsof het een tabel met een biljoen rijen is, alleen ben ik nu misschien bezig om teveel te optimaliseren. Zou mogelijkheid 1 (de simpele mogelijkheid) volstaan of moet ik mij bezig houden met inheritance en zo ja, wat is in dat geval de beste aanpak?
Case:
CRM-app (kan eender welke app zijn natuurlijk).Versimpelde weergave van tabellen:
Tabel: Company
Velden: ID (PK) company_name
Tabel: Contact
Velden: ID (PK) company_id (FK) first_name last_name
Nu wil ik een notitie-entity toevoegen zodat ik bij de huidige entities (company en contact) notities kan toevoegen. Wie weet komt er in de toekomst een entity bij, dan daarvoor ook een notitie.
De vraag is, hoe te doen.
Mogelijkheid 1 - Extra notitie-tabel aanmaken
Tabel: NotitiesVelden: ID (PK) company_id (FK) contact_id (FK) contents
Daarbij is één van de twee FK's null uiteraard. Nadeel: bij een nieuw toe te voegen entity moet er ook een nieuwe kolom bij (maar ja, hoe vaak gebeurt dat nu kan je zeggen).
Mogelijkheid 2 - Inheritance
Voor zover ik het begrepen heb maak je een superclass en daar hang je andere classes onder. In mijn geval zou dat dan worden:Entity: NotableEntity
Velden: ID
Entity: Company extends NotableEntity
Velden: company_name
Entity: Contact extends NotableEntity
Velden: company_id, first_name, last_name
Op deze manier heb ik unieke ID's voor Company én Contact, zou je zeggen. Alleen is company_id dan een ID in dezelfde tabel. dus ik weet niet of dat wel goed gaat.
De notitie tabel is dan heel simpel:
Tabel: Notities
Velden: ID (PK) notable_entity_id (FK) contents
Vraag:
Wat is slim om te doen? De tabel bevat 3000 companies dus performance-wise hoeft het niet op de milliseconde geoptimaliseerd te worden. Ik vind het wel leuk om iets op de professionele manier aan te pakken alsof het een tabel met een biljoen rijen is, alleen ben ik nu misschien bezig om teveel te optimaliseren. Zou mogelijkheid 1 (de simpele mogelijkheid) volstaan of moet ik mij bezig houden met inheritance en zo ja, wat is in dat geval de beste aanpak?