| 
  • If you are citizen of an European Union member nation, you may not use this service unless you are at least 16 years old.

  • You already know Dokkio is an AI-powered assistant to organize & manage your digital files & messages. Very soon, Dokkio will support Outlook as well as One Drive. Check it out today!

View
 

3_6_3

Page history last edited by Florian Heyerick 12 years ago
vorige volgende

Fase 3: data-analyse en datamodel


Inleiding

 

In eerste instantie werd er voor de GWVd gewerkt in de vorm van een plat model en binnen de applicatie Zoho Creator (zie fase 2).
Dit schept vele mogelijkheden, maar er zijn zeker ook beperkingen. Deze beperkingen situeren zich op het vlak van de databasestructuur, dit t.o.v. de rekenbladstructuur.

Daarom werd er in een derde fase gekozen voor het ontwerpen van een model voor een relationele database op basis van de verzamelde beschrijvingen. Dit model kan gebruikt worden voor digitale werkcatalogen van andere componisten, en heeft bovendien de mogelijkheid deze te integreren als aanzet tot vergelijkend onderzoek. Hoe dan ook heeft een genormaliseerde relationele database een structuur die onbeperkt kan uitgebreid en aangepast worden aan noden of wensen. Daarom zijn onderstaande gegevens te beschouwen als een ontwerp van datamodel.

 

Het ontwerpen van een relationele database is een noodzakelijk gegeven bij het professionaliseren van de uiteindelijke interface. Een algemeen overzicht van de uit te voeren stappen en handelingen daarbij vinden we in deze praktische online cursus: Het relationeel model bestaat uit een aantal aanbevelingen die je toe kan passen op het ontwerp van je database. Het beschrijft hoe gegevens logisch en efficiënt georganiseerd kunnen worden in tabellen en hoe gegevens uit verschillende tabellen gekoppeld kunnen worden. De meeste databases zijn tegenwoordig relationeel. (www.bagmeijer.com, 2007).

 

Bij het ontwerpen van de relationele database werd uiteraard uitgegaan van de beschreven parameters, waarbij het normaliseren tot de derde normaalvorm het objectief was. Opnieuw een citaat uit de online cursus:

 

Normaliseren heeft een aantal doelen.

  • Flexibiliteit. De genormaliseerde structuur van de database zorgt ervoor dat gegevens op veel verschillende manieren opgevraagd en bijgewerkt kunnen worden.
  • Integriteit. In een genormaliseerde database kan je gegevens zeer betrouwbaar opslaan.
  • Prestatiewinst. Door te voorkomen dat gegevens dubbel opgeslagen zijn bespaar je opslagruimte en maak je prestatiewinst. Een genormaliseerde database slaat gegevens maar op 1 plek op en niet dubbel (redundant).

 

Het normaliseren van een database komt eigenlijk neer op het nastreven van de volgende zaken:

  • Het verdelen van gegevens in logische samenhangende groepen.
  • Het minimaliseren van de hoeveelheid data die dubbel opgeslagen is, ofwel het voorkomen van 'redundancy'.
  • De gegevens zo organiseren dat het aanpassen of verwijderen van een gegeven altijd maar op één plek hoeft te gebeuren.
  • Gegevens zo organiseren dat ze snel en efficiënt op te vragen zijn.

 

De regels voor goed relationeel database-ontwerp zijn samengevat in 5 'normaalvormen', waarbij de eerste normaalvorm de laagste en de vijfde de hoogste (meest genormaliseerd) is. Deze normaalvormen zijn richtlijnen voor het juist ontwerpen van een relationele database. De meeste applicaties gebruiken databases die zijn genormaliseerd tot de 1ste, de 2de of de 3de normaalvorm.

 

De eerste normaalvorm (1NF)

is een set basale ontwerpregels die op elke database van toepassing moeten zijn. Een tabel is de representatie van een 'ding' uit het systeem dat je maakt. Elke rij in de tabel is een uniek exemplaar van dat 'ding'.

  • Elke tabel heeft een primaire sleutel: een zo klein mogelijk aantal velden dat een rij (record) uniek identificeert.
  • Atomiciteit: elk veld bevat maar één waarde.
  • De volgorde van de rijen in de tabel is onbelangrijk

 

De tweede normaalvorm (2NF)

het verwijderen van redundante gegevens

  • De database voldoet aan alle regels van de eerste normaalvorm.
  • Zo min mogelijk gegevens worden dubbel opgeslagen in de database.
  • De velden die geen primaire sleutel zijn, zijn afhankelijk van de primaire sleutel.

 

De derde normaalvorm (3NF)

transitieve afhankelijkheden

  • De database voldoet aan alle regels van de tweede normaalvorm.
  • Van een tabel die voldoet aan de derde normaalvorm zijn alle velden die geen primaire sleutel zijn uitsluitend afhankelijk van de primaire sleutel.

 

Bron: www.bagmeijer.com, 2007.

 

Datamodellen

 

Voor het ontwerpen en beschrijven van het datamodel werd er gebruikt gemaakt van twee programma's, MySQL Workbench, en Qlikview. 

 

Datamodel via MySQL

 

Kader

 

Voor het ontwerpen en beschrijven van het datamodel werd er gebruikt gemaakt van de software MySQL Workbench, een onderdeel van MySQL, The world's most popular open source database

De argumenten om deze software te gebruiken worden duidelijk verklaard via de website zelf: 

MySQL Workbench is a unified visual tool for database architects, developers, and DBAs. MySQL Workbench provides data modeling, SQL development, and comprehensive administration tools for server configuration, user administration, and much more. MySQL Workbench is available on Windows, Linux and Mac OS.

Design

MySQL Workbench enables a DBA, developer, or data architect to visually design, model, generate, and manage databases. It includes everything a data modeler needs for creating complex ER models, forward and reverse engineering, and also delivers key features for performing difficult change management and documentation tasks that normally require much time and effort. (www.mysql.com, 2011)

 

Van deze software gebruiken we uitsluitend de mogelijkheid tot Visual database Design: via een grafische interface tabellen beschrijven en ontwerpen, relaties definiëren en diagrammen genereren. Een ERD (entity-relationship-diagram) is een duidelijke weergave van de noodzakelijke onderdelen van een datamodel:

  • tabellen
  • relaties
  • datatypes
  • sleutels

 

De verschillende definities van deze onderdelen zijn overgenomen uit deze online cursus (Nootenboom, 2000).

 

Diagram (ERD)

 

Het entity-relationship-diagram[1] van dit datamodel wordt getoond op onderstaande afbeelding: tabellen, relaties, datatypes en sleutels

Centraal staan de tabellen work en mov, waarvan de kardinaliteit van de relatie 1:m is.

 

 

Tabellen

Een tabel is een matrix met gegevens (entities), georganiseerd in rijen (rows) en kolommen of attributen (columns).

De gegevens voor onze relationele database worden georganiseerd in genormaliseerde tabellen.

Uitgangspunt daarbij blijft dat een werk en niet de bron de unieke sleutel is.

De database kreeg de naam music[2], en daarbinnen werden 17 tabellen gecreëerd die via onderlinge relaties en zoekopdrachten de gebruiker moeten kunnen leiden naar de gevraagde gegevens.

Er zijn tabellen die gegevens bevatten op het niveau werk en op het niveau beweging van een werk. Deze laatste kregen een naam beginnend met mov.

Alle verdere informatie kan gevonden worden in het onderstaande SQL-script of op bovenstaande afbeelding..

Een overzicht in alfabetische volgorde:

 

tabel korte beschrijving
event The event the work is written for (lookup tabel)
mov description of the movements
movcharacter characternames of the instrumental (and vocal??) movements
movform form of the instrumental and vocal movements
movmeter meter of the movements
movmeterdesc description of category and type of meter
movpart differents parts of a movement
transposition -> movpartdesc_id
movpartdesc description of the parts (lookup table)
movtempo tempo-indications of the movements
movtonality tonality of the movements
movtxt text of the vocal movements
person persons involved in the works (composer, artist, poet, ruler)
person_has_work table between role, person and work
pub all online publications (occurences) related to a work by URL
role the function of a person related to the work: composer, poet, writer, performer, publisher, ....
vocal the textincipit of a vocal work = supplies additional information about the vocal aspects of vocal works -> no information is stored when ther are no vocal elements (vocal=1)
work description of the works

 

Relaties

In een relationele database is de integriteit van de relaties een grondbeginsel. Er zijn daarbij 4 soorten kardinaliteiten:

  • One to one (1:1) relationship
  • One to many (1:m) relationship
  • Many to one (m:1) relationship
  • Many to many (m:n) relationship

 

Op het ERD kan men de relaties aflezen volgens de Information Engineering Style[3]:

 

Datatypes

De verschillende datatypes zijn af te lezen van het ERD en maken deel uit van het SQL-script.

TEXT of (VAR)CHAR: tekstgegevens

BOOLEAN: een keuze tussen 0 en 1 / true en false

INT : een getal

TINYINT: een klein getal

 

Sleutels

de primaire sleutels en vreemde sleutels zijn met een sleutelsymbool (gele kleur) aangeduid in het ERD. Er wordt hier vaak gebruik gemaakt van een dubbele sleutel, omdat in vele tabellen de identificatie maar mogelijk is door de aanduiding van het werk en de beweging.

 

Datamodel via Qlikview

 

Kader

 

Qlikview is in essentie een visualisatieprogramma, met ontelbare gesofisticeerde mogelijkheden om grote gegevensbanken te benaderen en weer te geven in een gebruikersgeörienteerde omgeving. Het is uiterst gebruiksvriendelijk en kan voor persoonlijk thuisgebruik gratis geïnstalleerd worden op de eigen computer. Een (zwaar) betalende versie laat toe dat vele verschillende gebruikers via het internet dezelfde gegevens voor specifieke doeleinden kunnen opvragen. Deze interface zou zeer geschikt kunnen zijn om een database met de beschrijving van muzikale werken online ter beschikking te stellen (zie 3_6_4 fase 4)

Belangrijkste kenmerken, zoals beschreven op de website www.qlikview.com (gezien 15/4/2012) zijn de volgende:

 

 

  • Consolidating relevant data from multiple sources into a single application
  • Exploring the associations in your data
  • Enabling social decision making through secure, real-time collaboration
  • Visualizing data with engaging, state-of-the-art graphics
  • Searching across all data—directly and indirectly
  • Interacting with dynamic apps, dashboards and analytics
  • Accessing, analyzing and capturing data from mobile devices

 

meer video's: http://www.youtube.com/user/QlikTips/videos?view=0 

 

 

 Diagram

Het entity-relationship-diagram van deze database, zoals zelf gegenereerd door het programma, wordt getoond op onderstaande afbeelding: tabellen, relaties en sleutels

Centraal opnieuw staan de tabellen work en mov, maar in dit diagram worden de knooppunten (via de enkele, dubbele en driedubbele sleutels) tussen de tabellen duidelijk weergegeven.

 

 

Tabellen - relaties - datatypes

Hier zijn er 16 tabellen met elk een aantal parameters. De relaties, de parameters en de datatypes zijn duidelijk af te lezen van het ERD of af te leiden uit onderstaand script. 

 

Sleutels

Qlikview hanteert een zeer eenvoudig en ingenieus systeem om de tabellen aan elkaar te koppelen. Dit gebeurt op de achtergrond en geheel automatisch via de herkenning van velden met dezelfde naam. 

Ook dubbele sleutels worden herkend (zie afbeelding: $Syn 1 en $Syn 2) en er wordt een afzonderlijke tussentabel gegenereerd om een driedubbele sleutel te identificeren ($ Syn 2 Table). Eenvoudiger kan het niet. 

 

Scripts

QV-Scrtipts

Dit is een overzicht van de 16 opgeladen tabellen en bijhorende parameters:

 

LOAD work_id, 

     work_title, 

     work_form, 

     work_vocal, 

     work_year, 

     event_id, 

     soloist_amount, 

     work_date, 

     work_weekday, 

     work_day, 

     work_month

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\WORK.xls

(biff, embedded labels, table is work$);

 

LOAD work_id, 

     mov_id, 

     mov_amount, 

     mov_dacapo, 

     mov_dacapo_id, 

     opmerkingen

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOV.xls

(biff, embedded labels, table is mov$);

 

 

LOAD work_id, 

     vocal_incipit

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\VOCAL.xls

(biff, embedded labels, table is vocal$);

 

LOAD work_id, 

     mov_id, 

     movform_id, 

     movform_desc

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOVFORM.xls

(biff, embedded labels, table is movform$);

 

LOAD work_id, 

     mov_id, 

     movcharacter_id, 

     movcharacter_desc

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOVCHARACTER.xls

(biff, embedded labels, table is movcharacter$);

 

LOAD work_id, 

     mov_id, 

     movtonality_id, 

     movtonality_desc, 

     movtonality_category

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOVTONALITY.xls

(biff, embedded labels, table is movtonality$);

 

LOAD work_id, 

     mov_id, 

     movpartdesc_id, 

     movpart_amount, 

     movpart_adlib, 

     movpart_comment, 

     movpartdesc_id_amount

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOVPART.xls

(biff, embedded labels, table is movpart$);

 

LOAD work_id, 

     mov_id, 

     movmeter_id, 

     movmeterdesc_id, 

     movmeter_original, 

     movmeter_bars

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOVMETER.xls

(biff, embedded labels, table is movmeter$);

 

LOAD work_id, 

     person_id, 

     pub_id, 

     pub_type, 

     pub_link, 

     pub_name

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\PUB.xls

(biff, embedded labels, table is pub$);

 

LOAD person_id, 

     person_desc

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\PERSON.xls

(biff, embedded labels, table is person$);

 

LOAD work_id, 

     person_id, 

     role_desc, 

     role_doubtful

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\ROLE.xls

(biff, embedded labels, table is role$);

 

LOAD movpartdesc_id, 

     movpartdesc_name, 

     movpartdesc_group, 

     movpartdesc_fullname, 

     movpartdesc_tree

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOVPARTDESC.xls

(biff, embedded labels, table is movpartdesc$);

 

LOAD work_id, 

     mov_id, 

     movtempo_id, 

     movtempo_desc

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOVTEMPO.xls

(biff, embedded labels, table is movtempo$);

 

LOAD movmeterdesc_id, 

     movmeterdesc_category, 

     movmeterdesc_type, 

     movmeterdesc_tree

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOVMETERDESC.xls

(biff, embedded labels, table is movmeterdes$);

 

LOAD event_id, 

     event_name, 

     event_group, 

     event_ID_name, 

     event_tree

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\EVENT.xls

(biff, embedded labels, table is event$);

 

LOAD work_id, 

     mov_id, 

     movtxt_text

FROM

C:\Users\florian\Documents\Graupner\DB_tabellen_Googledocs\MOVTXT.xls

(biff, embedded labels, table is movtxt$);

 

 

SQL-script

Dit script zal opdracht geven aan de server de verschillende tabellen met de sleutel aan te maken.


-- -----------------------------------------------------
-- Table `music`.`event`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`event` (
  `event_id` INT NOT NULL ,
  `event_name` TEXT NOT NULL COMMENT 'Sunday of the Church Year' ,
  `event_group` TEXT NOT NULL COMMENT 'Church Season' ,
  PRIMARY KEY (`event_id`) )
ENGINE = InnoDB
COMMENT = 'The event the work is written for - lookup tabel' ;


-- -----------------------------------------------------
-- Table `music`.`work`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`work` (
  `work_id` VARCHAR(45) NOT NULL ,
  `work_title` TEXT NOT NULL COMMENT 'original title complete' ,
  `work_form` TEXT NOT NULL COMMENT 'sacred cantata\nsecular cantata\nopera\nouverture\npartita\nconcerto\nsinfonia' ,
  `work_vocal` TINYINT(1)  NOT NULL COMMENT 'instrumental=0\nvocal parts=1' ,
  `work_year` TEXT NULL COMMENT 'year of composition, if known' ,
  `event_id` INT NOT NULL COMMENT 'sunday of the church year ..' ,
  `soloist_amount` INT NULL ,
  PRIMARY KEY (`work_id`) ,
  INDEX `fk_event_id` (`event_id` ASC) ,
  CONSTRAINT `fk_event_id`
    FOREIGN KEY (`event_id` )
    REFERENCES `music`.`event` (`event_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'description of the works' ;


-- -----------------------------------------------------
-- Table `music`.`mov`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`mov` (
  `work_id` TEXT NOT NULL ,
  `mov_id` INT NOT NULL ,
  `mov_amount` INT NOT NULL COMMENT 'total number of movements (hard coded)' ,
  `mov_bars` INT NULL COMMENT 'total bars of a movement' ,
  `mov_dacapo` TINYINT NOT NULL DEFAULT 0 COMMENT 'no=0\nyes=1' ,
  `mov_dacapo_id` INT NULL COMMENT 'movement number repeated (1 to xx)' ,
  PRIMARY KEY (`work_id`, `mov_id`) ,
  INDEX `fk_work_id` (`work_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` )
    REFERENCES `music`.`work` (`work_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'description of the movements' ;


-- -----------------------------------------------------
-- Table `music`.`movtxt`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`movtxt` (
  `work_id` TEXT NOT NULL ,
  `mov_id` INT NULL ,
  `movtxt_text` LONGTEXT NOT NULL COMMENT 'text of the vocal movement\n' ,
  PRIMARY KEY (`work_id`, `mov_id`) ,
  INDEX `fk_mov_id` (`mov_id` ASC, `work_id` ASC) ,
  CONSTRAINT `fk_mov_id`
    FOREIGN KEY (`mov_id` , `work_id` )
    REFERENCES `music`.`mov` (`mov_id` , `work_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'text of the vocal movements' ;


-- -----------------------------------------------------
-- Table `music`.`person`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`person` (
  `person_id` INT NOT NULL ,
  `person_desc` TEXT NOT NULL COMMENT 'Graupner, Christoph\nHeyerick, Florian' ,
  PRIMARY KEY (`person_id`) )
ENGINE = InnoDB, 
COMMENT = 'persons involved in the works (composer, artist, poet, ruler' /* comment truncated */ ;


-- -----------------------------------------------------
-- Table `music`.`pub`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`pub` (
  `work_id` TEXT NOT NULL ,
  `pub_id` INT NOT NULL ,
  `pub_type` TEXT NOT NULL COMMENT 'edition\nrecording\nvideofile\naudiofile\nmidifile\nmusicxml\npdf-text\npdf-music\nautograph (library)' ,
  `pub_link` TEXT NOT NULL COMMENT 'hyperlink, URL (more information)' ,
  PRIMARY KEY (`work_id`, `pub_id`) ,
  INDEX `fk_work_id` (`work_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` )
    REFERENCES `music`.`work` (`work_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'all online publications (occurences) related to a work by UR' /* comment truncated */ ;


-- -----------------------------------------------------
-- Table `music`.`vocal`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`vocal` (
  `work_id` TEXT NULL ,
  `vocal_incipit` TEXT NOT NULL COMMENT 'First sentence of the cantata (title)' ,
  PRIMARY KEY (`work_id`) ,
  INDEX `fk_work_id` (`work_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` )
    REFERENCES `music`.`work` (`work_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'the textincipit of a vocal work = supplies additional inform' /* comment truncated */ ;


-- -----------------------------------------------------
-- Table `music`.`movpartdesc`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`movpartdesc` (
  `movpartdesc_id` TEXT NOT NULL COMMENT 'clarino in C, timpani ABCd' ,
  `movpartdesc_name` TEXT NOT NULL COMMENT 'name of the part: clarino, timpani' ,
  `movpartdesc_group` TEXT NOT NULL COMMENT 'group of instruments (woodwind, strings, ...): brass, percussion' ,
  PRIMARY KEY (`movpartdesc_id`) )
ENGINE = InnoDB, 
COMMENT = 'description of the parts (lookup table)' ;


-- -----------------------------------------------------
-- Table `music`.`movpart`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`movpart` (
  `work_id` TEXT NOT NULL ,
  `mov_id` INT NOT NULL ,
  `movpart_id` INT NOT NULL COMMENT 'number of the part' ,
  `movpartdesc_id` TEXT NOT NULL COMMENT 'code of the instrument (abbreviation), also in detail: clarino in C, ' ,
  `movpart_amount` INT NOT NULL DEFAULT 1 COMMENT 'number of one instrument in one movement (f.i. violin -> 2)' ,
  `movpart_adlib` TINYINT(1)  NOT NULL DEFAULT 0 COMMENT '0=obbligato\n1=optional/ad libitum' ,
  `movpart_comment` TEXT NULL COMMENT 'doubling, alternativ, doubtful, ...' ,
  PRIMARY KEY (`work_id`, `mov_id`) ,
  INDEX `fk_work_id` (`work_id` ASC, `mov_id` ASC) ,
  INDEX `fk_movpartdesc_id` (`movpartdesc_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` , `mov_id` )
    REFERENCES `music`.`mov` (`work_id` , `mov_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_movpartdesc_id`
    FOREIGN KEY (`movpartdesc_id` )
    REFERENCES `music`.`movpartdesc` (`movpartdesc_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'differents parts of a movement\ntransposition -> movpartdesc_' /* comment truncated */ ;


-- -----------------------------------------------------
-- Table `music`.`person_has_work`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`person_has_work` (
  `person_work_id` TEXT NOT NULL ,
  `person_person_id` INT NOT NULL ,
  `work_work_id` TEXT NOT NULL ,
  PRIMARY KEY (`person_work_id`, `person_person_id`, `work_work_id`) ,
  INDEX `fk_person_has_work_work1` (`work_work_id` ASC) ,
  INDEX `fk_person_has_work_person1` (`person_work_id` ASC, `person_person_id` ASC) ,
  CONSTRAINT `fk_person_has_work_person1`
    FOREIGN KEY (`person_person_id` )
    REFERENCES `music`.`person` (`person_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_person_has_work_work1`
    FOREIGN KEY (`work_work_id` )
    REFERENCES `music`.`work` (`work_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'table between role, person and work' ;


-- -----------------------------------------------------
-- Table `music`.`movtonality`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`movtonality` (
  `work_id` TEXT NOT NULL ,
  `mov_id` INT NOT NULL ,
  `movtonality_id` INT NOT NULL COMMENT 'sequence number (juxtaposed tonalities)' ,
  `movtonality_desc` TEXT NOT NULL COMMENT 'cis, F, G, d' ,
  `movtonality_category` INT NOT NULL COMMENT 'undefinable=0\nmajor=1\nminor=2' ,
  `movtonality_bars` INT NULL ,
  PRIMARY KEY (`work_id`, `mov_id`, `movtonality_id`) ,
  INDEX `fk_work_id` (`work_id` ASC, `mov_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` , `mov_id` )
    REFERENCES `music`.`mov` (`work_id` , `mov_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'tonality of the movements' ;


-- -----------------------------------------------------
-- Table `music`.`movmeterdesc`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`movmeterdesc` (
  `movmeterdesc_id` TEXT NOT NULL ,
  `movmeterdesc_category` TEXT NOT NULL COMMENT 'duple, ternair, quadruple' ,
  `movmeterdesc_type` TEXT NOT NULL COMMENT 'simple, compound, combined' ,
  PRIMARY KEY (`movmeterdesc_id`) )
ENGINE = InnoDB, 
COMMENT = 'description of category and type of meter' ;


-- -----------------------------------------------------
-- Table `music`.`movmeter`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`movmeter` (
  `work_id` TEXT NOT NULL ,
  `mov_id` INT NOT NULL ,
  `movmeter_id` INT NOT NULL ,
  `movmeterdesc_id` TEXT NOT NULL COMMENT 'modern notationform 3/4 instead of 3, etc - referring to meterdesc-entity' ,
  `movmeter_original` TEXT NOT NULL COMMENT '3, 2, C' ,
  `movmeter_bars` INT NULL ,
  PRIMARY KEY (`work_id`, `mov_id`, `movmeter_id`) ,
  INDEX `fk_work_id` (`work_id` ASC, `mov_id` ASC) ,
  INDEX `fk_movmeterdesc_id` (`movmeterdesc_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` , `mov_id` )
    REFERENCES `music`.`mov` (`work_id` , `mov_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_movmeterdesc_id`
    FOREIGN KEY (`movmeterdesc_id` )
    REFERENCES `music`.`movmeterdesc` (`movmeterdesc_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'meter of the movements' ;


-- -----------------------------------------------------
-- Table `music`.`movtempo`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`movtempo` (
  `work_id` TEXT NOT NULL ,
  `mov_id` INT NOT NULL ,
  `movtempo_id` INT NOT NULL ,
  `movtempo_desc` TEXT NOT NULL COMMENT 'none, allegro, vivace non troppo - eventually lookup table ...' ,
  `movtempo_bars` INT NOT NULL COMMENT 'amount of bars of each division' ,
  PRIMARY KEY (`work_id`, `mov_id`, `movtempo_id`) ,
  INDEX `fk_work_id` (`work_id` ASC, `mov_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` , `mov_id` )
    REFERENCES `music`.`mov` (`work_id` , `mov_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'tempo-indications of the movements' ;


-- -----------------------------------------------------
-- Table `music`.`movform`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`movform` (
  `work_id` TEXT NOT NULL ,
  `mov_id` INT NOT NULL ,
  `movform_id` INT NOT NULL ,
  `movform_desc` TEXT NOT NULL COMMENT 'menuet, aria, choral, bourrée, ouverture' ,
  `movform_bars` INT NOT NULL COMMENT 'amount of bars of each division' ,
  PRIMARY KEY (`work_id`, `mov_id`, `movform_id`) ,
  INDEX `fk_work_id` (`work_id` ASC, `mov_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` , `mov_id` )
    REFERENCES `music`.`mov` (`work_id` , `mov_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'form of the instrumental and vocal movements' ;


-- -----------------------------------------------------
-- Table `music`.`movcharacter`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`movcharacter` (
  `work_id` TEXT NOT NULL ,
  `mov_id` INT NOT NULL ,
  `movcharacter_id` INT NOT NULL ,
  `movcharacter_desc` TEXT NOT NULL COMMENT 'morosita, la congiurazione, ...' ,
  `movcharacter_bars` INT NOT NULL COMMENT 'amount of bars of each division - not relevant' ,
  PRIMARY KEY (`work_id`, `mov_id`, `movcharacter_id`) ,
  INDEX `fk_work_id` (`work_id` ASC, `mov_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` , `mov_id` )
    REFERENCES `music`.`mov` (`work_id` , `mov_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'characternames of the instrumental (and vocal??) movements' ;


-- -----------------------------------------------------
-- Table `music`.`role`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `music`.`role` (
  `work_id` VARCHAR(45) NOT NULL COMMENT 'fk work' ,
  `person_id` INT NOT NULL COMMENT 'fk person' ,
  `role_desc` TEXT NOT NULL COMMENT 'composer, writer, ruler, poet, artist, ...' ,
  `role_doubtful` TINYINT(1)  NOT NULL DEFAULT 0 COMMENT '0=certain\n1=doubtful' ,
  PRIMARY KEY (`work_id`, `person_id`) ,
  INDEX `fk_work_id` (`work_id` ASC) ,
  INDEX `fk_person_id` (`person_id` ASC) ,
  CONSTRAINT `fk_work_id`
    FOREIGN KEY (`work_id` )
    REFERENCES `music`.`work` (`work_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_person_id`
    FOREIGN KEY (`person_id` )
    REFERENCES `music`.`person` (`person_id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB, 
COMMENT = 'the function of a person related to the work: composer, poet' /* comment truncated */ ;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

 

 

 

 

 

 

 

Footnotes

  1. een ERD is een datamodel of diagram voor het grafisch representeren van een conceptueel datamodel. Het is een visuele weergave van de entiteiten, relaties en beperkingen die gelden of aanwezig zijn in een bepaald ontwerp. Deze diagrammen worden gemaakt bij het ontwerpen van een informatiesysteem om inzicht te krijgen in de benodigde informatie en de verbanden tussen de gegevens. Zo wordt het vaak gebruikt om een visuele weergave te maken van een relationeel model. Het gemaakte diagram kan vervolgens omgezet worden in een database. Het entity-relationship-model kan dus ook worden gezien als een methodologie voor het ontwerpen van een datamodel en database.(http://nl.wikipedia.org/wiki/Entity-relationshipmodel, geraadpleegd op 11/12/11)
  2. een wat hoogdravende benaming, maar symbolisch voor het concept dat elk muziekwerk hierin een plaats zou moeten vinden ...
  3. ook genoemd Kraaienpootnotatie (Crow's Foot Notation)

Comments (0)

You don't have permission to comment on this page.