Takker for innspill her. Dette er ikke en konkret case jeg jobber med, men et generelt problem som dukker opp i mange sammenhenger der databaseskjemaet ikke er spikret på forhånd.
Å modellere en database der feltnavn heter "felt" og "verdi" bryter med prinsippet om relasjoner og referanseintegritet, man er i gang med å bygge en database i databasen, og mister da fordelene som en relasjonsdatabase gir. Dette er egentlig et antipattern (EAV/entity-attribute-value, generic data model) og de stedene jeg har brukt en slik løsning har det vært ekstremt tungvint å jobbe med. Rapportering, søk, filtrering, validering, feltlengde etc er halsbrekkende i en slik modell. Og når man kommer opp i noen hundre tusen rader begynner man å merke performance-problemene, det går tregere og tregere, brukerne blir oppgitte og vil ikke bruke systemet.
Her er litt om
EAV fra Wikipedia:
In the database world, developers are sometimes tempted to bypass the RDBMS, for example by storing everything in one big table with two columns labelled key and value. While this entity-attribute-value model allows the developer to break out from the rigid structure imposed by a relational database, it loses out on all the benefits, since all of the work that could be done efficiently by the RDBMS is forced onto the application instead. Queries become much more convoluted, the indexes and query optimizer can no longer work effectively, and data validity constraints are not enforced. Such designs rarely make their way into real world production systems, however, because performance tends to be little better than abysmal, due to all the extra joins required.
Inner-platform effect - Wikipedia, the free encyclopedia
Hva med å lagre en
XML-kolonne i databasen, som inneholder produktdetaljene?
A similar temptation exists for XML, where developers sometimes favor generic element names and use attributes to store meaningful information. For example, every element might be named item and have attributes type and value. This practice requires joins across multiple attributes in order to extract meaning. As a result, XPath expressions are more convoluted, evaluation is less efficient, and structural validation provides little benefit.
Èn stor tabell
Dette er "lillebroren" til EAV, og du møter samme problemene her.
Alias for Kolonne1, Kolonne2 etc?
Mange ender med denne løsningen. Den har jo sine begrensninger, feks hvor mange felt skal man legge inn, og hva skal feltlengden være?
Skjemaet endres -> faktisk endre skjemaet?
Et alternativ er å definere så mye du har tilgang til av felt initielt. Dvs gå gjennom alle produktark, og bygge databasen felt for felt. Når du så importerer data fra nye produktark, må nye felt legges inn on-the-fly vha SQL (ALTER TABLE). Dette har jeg ikke erfaring med, og det kunne vært interessant å høre hvordan en slik løsning fungerer i praksis.
Noe annet i bunnen enn en relasjonsdatabase?
Dokument-orienterte databaser blir ofte nevnt som alternativ til EAV:
Document-oriented database. Noen som har erfaring med en slik løsning? Noe sier meg at dette er litt overkill i de fleste tilfeller.
Det er enormt mye info om dette emnet på nettet, her er et lite utvalg:
Inner platform effect, thedaylywtf:
The Inner-Platform Effect - The Daily WTF
Dynamisk DB-skjema, StackOverflow:
Dynamic Database Schema - Stack Overflow
AskTom @ Oracle:
Ask Tom "Query on design"
Problemene du møter på med EAV:
Daves guide to the EAV
One True Lookup Table:
DBAzine.com: One True Lookup Table