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 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, 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:
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;
Comments (0)
You don't have permission to comment on this page.